l6_Cpp_.ppt
- Количество слайдов: 83
Функції, область дії змінних 1
Прототип функції (сигнатура) Синтаксис <Тип-значення, що повертається> ім'я_функції(<список параметрів>); Приклад int product (int x, int y); char gruppa( char nazva grup[5], char starosta[20], int kilk); 2
Визначення (опис) функції Синтаксис <Тип-поверт-значення> ім'я_функції (тип-арг ім'я -1, . . . , тип-арг ім'я n) { /* оператори ; */ } Приклад int product (int x, int y) {return (x*y); } 3
Виклик функціїї Синтаксис <тип значення, що повертається> ім’я функції (<список аргументів>); Приклад: wait (12); product (7, 8); Kino(); printf ( " Добуток 2 чисел %f", product (7, 8)); 4
Функція не може повертати масив або функцію, але може повертати вказівник на будь-який тип, у тому числі і на масив і на функцію. n Тип значення, що повертається і задається у визначенні функції, має відповідати типу в об'яві цієї функції. n Якщо функція не використовує параметрів, то наявність круглих дужок обов'язкова, а замість списку параметрів рекомендується вказати слово void. n 5
Клас пам'яті Класи пам'яті змінних Час життя Де об'явлена Область дії Автоматич необов'язкона ве auto Тимчасова У функції Локальна Статична static Тимчасова У функції Локальна Регістрова register Тимчасова У функції Локальна Зовнішня для об'яви статичної змінної, що створена в іншому місці Постійна Зовні функції Глобальна (всі файли) Постійна Зовні функції Глобальна (один файл) 6 Зовнішня Ключове слово extern static
Рекурсивний виклик Термін рекурсивний виклик, або рекурсія відповідає ситуації, коли функція викликає сама себе явним або неявним чином. Непрямий рекурсивний виклик означає, що одна функція викликає іншу, а потім викликає першу. 7
Рекурсивні функції long fact(long n){ if (n==0 || n==1) return 1; return (n * fact(n - 1)); } Або: long fact(long n){ return (n > 1) ? n * fact(n - 1) : 1; } 88
Математичні функції: Тригонометричні функції n Ступеневі і логарифмічні функції n Гіперболічні функції n Інші математичні функції n заголовочний файл math. h n тип значення, що повертається double n 9
Тригонометричні функції аргументи функцій виражаються у радіанах n один радіан=57, 296 градуса n повне коло 360 градусів = 2 радіан n 10
Тригонометричні функції cos() sin() tg() n прототипи: double cos (double x) double sin (double x) double tan (double x) n опис повертають: косінус, синус, тангенс свого аргумента n 11
Тригонометричні функції функція acos() n прототип double acos ( double x ) n опис повертає аркосинус аргументу, аргумент повинен міститись у інтервалі -1<= x<=1 значення належить інтервалу від 0 до включно n 12
Тригонометричні функції функція asin() n прототип double asin ( double x ) n опис повертає арксинус аргументу, аргумент повинен міститись у інтервалі -1<= x<=1 значення належить інтервалу від n - /2 до /2 включно 13
Тригонометричні функції функція atan() n прототип double atan ( double x ) n опис повертає арктангенс аргументу значення належить інтервалу від n - /2 до /2 включно 14
Тригонометричні функції функція atan 2() n прототип double atan ( double x, double y ) n опис повертає арктангенс х/y значення належить інтервалу від n - до включно 15
Ступеневі та логарифмічні функції функція exp() n прототип double exp ( double x ) n опис повертає експоненту свого аргументу тобто ex , де е дорівнює 2. 718284590452354 n 16
Ступеневі та логарифмічні функції функція log() n прототип double log ( double x ) n опис повертає натуральний логарифм свого аргументу, аргумент повинен бути невід’ємним n 17
Ступеневі та логарифмічні функції функція log 10() n прототип double log 10 ( double x ) n опис повертає десятковий логарифм аргументу. Аргумент повинен бути невід’ємним n 18
Ступеневі та логарифмічні функції функція frexp() n прототип double frexp ( double x, int *y ) n опис обчислює нормалізований дріб, що представляє х. Повертає дріб r із діапазону 0. 5<=r<=1. 0 Змінній y присвоюється значення цілого показника ступеня, таке, що x=r*2 y якщо до функції передається 0 то r та y дорівнюють 0. n 19
Ступеневі та логарифмічні функції функція fdexp() n прототип double fdexp ( double x, int y ) n опис повертає x*2 y n 20
Гіперболічні функції cosh() sinh() tgh() n прототипи: double cosh (double x) double sinh (double x) double tanh (double x) n опис повертають: гіперболічний косінус, синус, тангенс свого аргументу n 21
Інші математичні функції функція sqrt() n прототип double sqrt ( double x ) n опис повертає корінь квадратний із аргументу. Аргумент повинен бути невід’ємним n 22
Інші математичні функції функція ceil() n прототип double ceil ( double x ) n опис повертає найменше ціле число, що є більшим за аргумент за величиною. Наприклад, ceil(4. 5) повертає 5. 0, а ceil(-4. 5) повертає -4 n Хоча повертається ціле число воно має тип double n 23
Інші математичні функції функція floor() n прототип double floor ( double x ) n опис повертає найбільше ціле число, що є меншим за аргумент за величиною. Наприклад, floor(4. 5) повертає 4. 0, а ceil(-4. 5) повертає -5 n Хоча повертається ціле число воно має тип double n 24
Інші математичні функції функція modf() n прототип double modf ( double x, double *y ) n опис розбиває х на цілу і дробову частину з тим же знаком, що x та y. функція повертає цілу частину, а дробову розміщує у *y n 25
Інші математичні функції функція fmod() n прототип double fmod ( double x, doubley ) n опис повертає дійсний залишок від ділення х/y з тим же знаком, що й x та y. Якщо х==0 то функція повертає 0. n 26
Інші математичні функції функція pow() n прототип double pow ( double x , double y) n опис повертає xy Якщо х==0 і у<= 0 або якщо x<0 та у не ціле число то повертається помилка n 27
Перевантаження функцій 28 28
#include <iostream. h> //Перевантаження функції abs() int abs(int i); long abs(long l); double abs(double d); main() { int n=255; long l=-25 L; double d=-15. 0 L; cout<<"Абсолютна величина "<<n<<"дорівнює"<<abs(n)<<"n"; cout<<"Абсолютна величина "<<l<<"дорівнює"<<abs(l)<<"n"; cout<<"Абсолютна величина "<<d<<"дорівнює"<<abs(d)<<"n"; return 0; } int abs(int n) { return n<0? -n: n; } long abs(long l) { return l<0? -l: l; } double abs(double d) { return d<0? –d: d; } 29 29 29
Функции введення/виводу <stdio. h> або <cstdio>. FILE* fopen(const char* filename, const char* mode); mode: (b/t)і "r" — файл відкривається для зчитування; "w" — відкривається порожній файл для запису (якщо файл існує, він стирається); "a" — файл відкривається для добавлення інформації в його кінець; "r+" — файл відкривається для зчитування і запису (файл має існувати); "w+" — відкривається пустий файл для зчитування і запису (якщо файл існує, він стирається); "a+" — файл відкривається для зчитування і добавлення інформації в його кінець FILE *f = fopen("d: \cpp\data. txt", "rb+"); 30 30
Функции введення/виводу Зчитування і запис потока байтів — fread, fwrite. Зчитування з потоку — getc, fgetc, із стандартного потоку stdin — getchar. Запис символа в потік — putc, fputc, в стандартный потік stdout — putchar. Зчитування рядка з потока — fgets, із стандартного потоку stdin — gets. Запись рядка в потік — fputs, в стандартний потік stdout — puts. Форматироване введення з потока — fscanf, з стандартного потока stdin — scanf, із рядка — sscanf. Форматований вивід в поток — fprintf, в стандартний потік stdout — printf, в рядок— sprintf. int fclose(FILE*); int feof(FILE*); int ferror(FILE*); 31 31
Робота з файлами – приклад 1 #include <iostream. h> <stdio. h> <stdlib. h> <conio. h> int main(){ FILE *fi, *fo; if((fi = fopen("d: \c\file. txt", "r")) == 0){ cout << «Помилка"; return 1; }; if((fo = fopen("d: \c\binfile. out", "w+b"))==0){ cout << " Помилка "; return 1; }; const int dl = 80; char s[dl]; 32 32
Робота з файлами – приклад 1 struct{ char int char type[20]; opt, rozn; comm[40]; }mon; while (fgets(s, dl, fi)){ // Рядок-у структуру: strncpy(mon. type, s, 19); mon. opt = atoi(&s[20]); mon. rozn = atoi(&s[25]); strncpy(mon. comm, &s[30], 40); fwrite(&mon, sizeof mon, 1, fo); } fclose(fi); 33 33
Робота з файлами – приклад 1 int i; cin >> i; // Номер запису fseek(fo, (sizeof mon)*i, SEEK_SET); fread(&mon, sizeof mon, 1, fo); cout << "mon. type " << mon. type << " opt " << mon. opt << " rozn " << mon. rozn << endl; fclose(fo); return 0; } 34 34
Інші функції бібліотеки isalnum isalfa iscntrl isdigit isgraph islower isprint ispunct isspace isupper isxdigit double atof(const char* p) int atoi(const char* p) long atol(const char* p) Копіювання рядків (strcpy, strncpy) Порівняння (strcmp, strncmp), Об’єднання рядків (strcat, strncat) Пошук підрядка(strstr) Пошук вхолдення символа(strchr, strpbrk) Визначення довжини рядка(strlen) тощо Математические 35 35
Використання стандартних функцій #include <stdio. h> #include <string. h> #include <stdlib. h> int main(){ char s[] = "2, 38. 5, 70, 0, 0, 1", *p = s; float m[10]; int i = 0; do{ m[i++] = atof(p); if (i>9) break; }while(p = strchr(p, ', '), p++); for( int k = 0; k<i; k++) printf("%5. 2 f ", m[k]); return 0; } 36 36
Директиви препроцесора Директива #include: #include <им’я_файлу> “ “ Заголовочні файли можуть містити: lвизначення типів, констант, вбудованих функцій, шаблонів, переліків; l оголошення функцій, даних, імен, шаблонів; lпростори імен; lдирективи препроцесора; l коментарі. У заголовному файлі не має бути визначень функцій і даних. 37 37
Зовнішні об’яви Щоб зробити доступною в декількох модулях змінну або константу, необхідно: визначити її в одному модулі як глобальну; оголосити її як зовнішню за допомогою модифікатора extern. Помістити це оголошення або в потрібні модулі, або в заголовочний файл, який включити в потрібні модулі. // my_header. h extern int a; extern double b; // ---------// one. cpp #include "my_header. h" int a; // ---------// two. cpp #include "my_header. h" double b; Всі оголошення однієї змінної мають бути узгоджені 38 38
Директива #define Практично кожен макрос свідчить про недолік в мові, програмі або програмістові Використовується для визначення: lсимволічних констант : #define им’я текст_подстановки lмакросів: #define им’я( параметри) текст_подстановки lсимволів, управляючих #define им’я умовною компиляцією: #define M 1000 #define Vasia “Василь Петрович” #define MAX(x, y) ((x)>(y)? (x): (y)) 39 39
#define N(a, b) a##b /*склеїти */ … int N(bam, buk)(); /* => int bambuk(); */ Альтернативи макросам в С++: const, inline, template, namespace #undef iм’я 40 40
Директиви умовної компиляції: #if -- #endif Призначення: - виключити компіляцію окремих частин програми - Тимчасово закоментувати частину коду #if конст_вираз. . . [ #elif конст_вираз #if OPT == 2 #include “hdr 2. h”. . . ] #elif OPT == 1 [ #elif конст_вираз #include “hdr 1. h”. . . ] #elif [ #else #include <cstdlib> ] #endif 41 41
Директивы умовної компиляції: приклад #if defined(__BORLANDC__) && __BORLANDC__ == 0 x 530 // Tested with BC 5. 3: typedef istream_iterator<int, char_traits<char>, ptrdiff_t> istream_iter; #elif defined(__BORLAND__) // Tested with BC 5. 2: typedef istream_iterator<int, ptrdiff_t> istream_iter; #else // Tested with VC 5. 0: typedef istream_iterator<int> istream_iter; #endif #if 0 int i, j; double x, y; #endif 42 42
Директиви #ifdеf і #ifndеf #ifdef символ // Розташований нижче код компілюється, якщо символ визначений #ifndef символ // Розташований нижче код компілюється, якщо символ не визначений #ifndef HEADER_INCLUDED #include "myheader. h" #define HEADER_INCLUDED #endif 43 43
n Для управління форматуванням бібліотека С++ передбачає три види засобів форматування: – функції форматування; – прапорці; – маніпулятори. n Всі ці засоби є членами класу basic_ios і тому є доступними для всіх потоків 44 44
Функції-члени форматування n До функцій-членів форматування належать: – width() – precision() – fill() 45 45
Функція форматування width() n n n За замовчуванням у процесі виведення будьякого значення воно займає стільки позицій, скільки символів виводиться. Функція width() дозволяє задати мінімальну ширину поля для виводу значення. У процесі введення вона задає максимальне число символів, що зчитуються. Якщо значення, що виводиться має меншу кількість символів, то воно доповнюється символами-заповнювачами до заданої ширини (за замовчуванням – прогалинами) Якщо значення, що виводиться має більшу кількість символів – поле буде розширеним до потрібного розміру 46 46
Функція має наступний прототип: streamsize width(streamsize wide); streamsize width() const; n Тип streamsize визначений в файлі заголовку <iostream> як цілочисловий n Функція з першим прототипом задає ширину поля wide а повертає попереднє значення ширини поля. n Функція з другим прототипом повертає поточне значення ширини поля. За замовчуванням воно дорівнює нулю n 47 47
Функція форматування precision() дозволяє визначити або задати точність (кількість символів після коми, що виводяться), з якою виводяться числа з рухомою крапкою. n За замовчуванням ці числа виводяться з точністю до 6 цифр. n 48 48
Функція має наступні прототипи: streamsize precision (streamsize prec); streamsize precision() const; n Функція з першим прототипом встановлює точність, що дорівнює prec і повертає попередню точність. n Функція з другим прототипом повертає поточну точність n 49 49
Функція форматування fill() дозволяє прочитати, або встановити символзаповнювач. Вона має наступні прототипи: char_type fill(char_type ch); char_type fill const; n Функція з першим прототипом встановлює ch в якості поточного символу - заповнювача і повертає попередній символ-заповнювач. n Функція з другим прототипом повертає поточний символ-заповнювач. n За замовчуванням символ-заповнювач – прогалина. n 50 50
Прапорці З кожним потоком пов'язаний набір прапорців, що управляють форматуванням потоку. n Вони є бітовими масками , що визначені в класі ios як дані enumтипу fmt_flags. n Прапорці належать типу fmtflags , що визначений наступним чином: typedef int fmtflags; n 51 51
Прапорці форматування та їх призначення прапорець призначення boolalpha Значення булєвого типу встановлюються і вилучаються у вигляді слів true або false Значення цілого типу перетворюються як шістнадцяткові hex dec Значення цілого типу перетворюються як десяткові oct Значення цілого типу перетворюються як вісімкові 52 52
прапорець призначення fixed Числа з рухомою крапкою виводяться у форматі з фіксованою крапкою (nnn. ddd) Числа з рухомою крапкою виводяться в науковому форматі (n. xxx. Eyy) виводиться основи системи числення у вигляді префікса до цілого числового значення, наприклад число IEF як 0 x 1 FE У процесі виведення значень з рухомою крапкою виводиться десяткова крапка і подальші нулі scientific showbase showpoint 53 53
прапорець призначення showpos У процесі виведення додатних числових значень виводиться знак "+" Заміняє визначені символи нижнього регістру на символи верхнього регістру (символ е у процесі виведення символів у науковому форматі на Е символи х для 16 -кових чисел на Х дані вирівнюються за лівим краєм поля дані вирівнюються за правим краєм поля uppercase left right 54 54
прапорець призначення internal додаються символи-заповнювачі між всіма цифрами і знаками числа для заповнення поля виводу ведучі символи – заповнювачі(знаки прогалини, табуляції і переведення рядка відкидаються) вихідний буфер очищується після кожної операції вставки до потоку skipws unitbuf 55 55
Прочитати поточні значення прапорців можна за допомогою функції-члена flags() класу ios n Для цього використовується наступний прототип цієї функції fmtflags() const; n 56 56
Функція flags() має і іншу форму, що може використовуватись для встановлення значень прапорців. fmtflags(fmtflags fmtl); в цьому випадку функція вертає попередній набір прапорців. Ця форма рідко використовується, бо змінює весь набір прапорців n 57 57
Замість попередньої функції використовується функція-член self() класу ios, що дозволяє встановити значення одного або кількох прапорців. fmtflags setf (fmtflags mask); fmtflags setf (fmtflags fmtfl, fmtflags mask); Перша функція-член неявно викликає функцію flags( mask | flags()) для встановлення бітів, вказаних параметром mask і повертає попередні значення прапорців. Другий варіант функції присвоює бітам, вказаним параметром mask, значення бітів, параметра fmtfl, потім повертає попередні значення прапорців. n 58 58
Приклад встановлення для потоку cout прапорців hex uppercase функцією self() cout. setf( ios: : hex| ios: : uppercase); n Скинути встановлені прапорці можна за допомогою функції – члена unsetf() класу ios void unsetf (fmtflags mask); функція скидає прапорці, що встановлені параметром mask n 59 59
Приклад використання деяких прапорців #include <iostream. h> main() { double d=1. 321 e 9; int n=1024; //вивести значення cout<<"d="<<d<<"n"; cout<<"n="<<n<<"n"; //змініити прапорці і вивести значення cout. setf(ios: : hex | iosuppercase); cout. setf(ios: : showpos); cout<<"d="<<d<<"n"; cout<<"n="<<n<<"n"; return 0; } n 60 60
n n Система введення – виведення С++ передбачає ще один спосіб форматування потоку. Цей спосіб ґрунтується на використанні маніпуляторів введення-виведення. Маніпулятори – функції-члени класу ios, що розміщені всередині інструкцій введеннявиведення 61 61
Маніпулятори введення виведення та їх призначення Маніпулятор Використан Призначення ня boolalpha введення. Встановлює виведення прапорець boolalpha dec введення. Встановлює виведення прапорець dec endl виведення Вставляє символ нового рядку і очищує буфер ends виведення Вставляє символ 62 кінця рядка 62
Маніпулятор Використан ня fixed виведення flush виведення hex введеннявиведення internal виведення Призначення Встановлює прапорець fixed Очищує буфер потоку Вставляє прапорець hex Вставляє прапорець internal 63 63
Маніпулятор Використан ня left виведення noboolalpha noshowbase введеннявиведення noshowpoint виведення Призначення Встановлює прапорець left Скидає прапорець noboolalpha Скидає прапорець noshowbase Скидає прапорець noshowpoint 64 64
Маніпулятор Використан ня noshowpos виведення noskipws виведення noinitbuf виведення nouppercase виведення Призначення Скидає прапорець showpos Скидає прапорець skipws Скидає прапорець initbuf Скидає прапорець uppercase 65 65
Маніпулятор Використанн я oct виведення Resetiosflags (ios_base: : fm tflags mask) right scietific введеннявиведення Призначення Встановлює прапорець oct Скидає ios - прапорці у відповідності до mask Скидає прапорець initbuf Скидає прапорець uppercase 66 66
Маніпулятор Використання Призначення setbase (int base) введеннявиведення Задає основу системи числення для цілих Встановлює символзаповнювач Встановлює ios – прапорці у відповідності до mask введеннявиведення Встановлює точність чисел з рухомою крапкою setfill (char. T c) setiosflags (ios_base: : fmtflags mask) setprecision(int i) 67 67
Маніпулятор Використанн я setw( int n) введеннявиведення showbase виведення showpoint виведення showpos виведення Призначення Встановлює мінімальну ширину поля Встановлює прапорець showbase Встановлює прапорець showpoint Встановлює прапорець showpos 68 68
Маніпулятор Використанн я skipws введення unitbuf виведення uppercase виведення ws введення Призначення Встановлює прапорець skipws Встановлює прапорець unitbuf Встановлює прапорець uppercase Встановлює пропуск символівзаповнювачів 69 69
Для доступу до маніпуляторів з параметрами слід підключити до програми стандартний файл заголовку <iomanip. h> n У процесі використання маніпулятора без параметру дужки за ним не ставляться, бо він є вказівником на функцію-член, що передається перевантаженому оператору << n 70 70
Приклад використання маніпуляторів #include <iostream. h> #include <iomanip. h> #include <math. h> main() { double x; cout<< setprecision(4); cout<<setfill('0'); cout<<" x sqrt(x) x^2 nn"; for (x=1; x<=6. 0; x++) { cout<<setw(7)<<x<<" "; cout<<setw(7)<<sqrt(x)<<" "; cout<<setw(7)<<x*x<<"n"; return 0; } } n 71 71
Для здійснення операцій з файлами використовуються три класи: n ifstream n ofstream n fstream Ці класи є похідними від istream. ostream iostream, що є в свою чергу похідними від ios і тому наслідують всі функціональні можливості батьків (перевантажені операції << та >>, для вбудованих типів, функції і прапорціформатування, маніпулятори тощо) Для реалізації файлового введення-виведення слід включити файл заголовку <fstream. h> n 72 72
Існує незначна відмінність між використання зарані визначених і файлових потоків. n Файловий потік повинен бути зв'язаний з файлом перед його використанням n 73 73
n Для створення файлового потоку класи операцій над файлами передбачають наступні форми конструктора: – створити поток, не зв'язуючи його з файлом: explicicit ifstream(); explicicit ofstream(); explicicit fstream(); 74 74
– створити поток, відкрити файл і зв'язати поток з файлом: explicicit ifstream(const char *name, ios: : openmode=ios: : in); explicicit ofstream(const char *name, ios: : openmode=ios: : out | ios: : trunc); explicicit fstream(const char *name, ios: : openmode=ios: : in |ios: : out ); 75 75
Щоб відкрити файл для введення і виведення можна використати другу форму потрібного конструктора fstream fs("Filename. dat); n або створити потік за допомогою першої форми конструктора, а потім відкрити файл і зв'язати поток з відкритим файлом, за допомогою функції-члена open() void ifstream: : open( const char *name, ios: : openmode=ios: : in) void ofstream: : open( const char *name, ios: : openmode=ios: : out | ios: : trunc) void ifstream: : open( const char *name, ios: : openmode=ios: : in |ios: : out ) name – ім'я файла, mode – режим відкриття n 76 76
Режими відкриття та їх призначення Режим відкриття Призначення ios: : in Відкрити файл для зчитування ios: : out Відкрити файл для запису ios: : ate ios: : trunc Початок введення встановлюється в кінець файлу Відкрити файл для добавлення на кінець Знищити вміст файлу ios: : binary Двійковий режим операцій ios: : app 77 77
Режим відкриття файлу-бітові маски, тому можна задавати два чи більше режими, об'єднуючи їх операцією "АБО" приклад відкриття файлу за допомогою функції open() ofstream ofs; ofs. open("File. Name. dat"); За замовчуванням режим відкриття файлу відповідає типу файлового потоку. У потока введення чи виведення прапорець режиму завжди встановлений неявно n 78 78
Для потока виведення в режимі добавлення файла можна замість інструкції ofstream ; ofs("File. Name. txt", ios: : out | ios: : app); записати наступну ofstream ofs("File. Name. txt", ios: : app); n 79 79
n n n Між режимами ios: : ate і ios: : app існує незначна відмінність. Якщо файл відкривається в режимі добавлення , все виведення до файлу буде здійснюватись у позицію, що починається з поточного кінця файлу , без зважання на операції позиціонування у файлі. В режимі відкриття ios: : ate (від "at end") можна змінити позицію виведення до файлу і здійснити запис, починаючи з неї. Для потоків виведення режим відкриття відповідний ios: : out | ios: : trunc ( можна пропустити режим знищення вмісту файла) Але для потоків введення-виведення його потрібно задавати явно. Файли, що відкриваються для виведення створюються, якщо вони ще не існують. 80 80
Якщо відкриття файлу не здійснилось, об'єкт, що відповідає потоку поверне false: if (!osf) { cout<<"Файл не відкривсяn"; } Перевірити успішність відкриття файлу можна за допомогою функції-члена is_open() що має прототип: bool is_open() const; Функція повертає true якщо поток зв'язаний з відкритим файлом if (!osf. is_open()) { cout<<"Файл не відкритийn"; } n 81 81
n Якщо в процесі відкриття файлу не вказаний режим ios: : binary файл відкривається у текстовому режимі, і після його успішного відкриття для виконання операцій введеннявиведення можна використовувати оператори вилучення і вставки до потоку. Можна також використовувати функції введеннявиведення, що використовуються у С (fprintf() fscanf()) 82 82
У випадку завершення операцій введення -виведення слід закрити файл за допомогою функції-члена close() ofs. close(); ця функція не має параметрів і повертає значення void close(); Закриття файлу відбувається автоматично у процесі виходу об'єкта потока із області видимості, коли викликається деструктор потока n 83 83
l6_Cpp_.ppt