Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курс лекцій.doc
Скачиваний:
15
Добавлен:
03.11.2018
Размер:
1.12 Mб
Скачать

12.7 Файловий ввід-вивід

Бiблiотека С++ має три спецiалiзованих класи для файлового вводу/виводу:

ifstream: для операцiй з вхiдним дисковим фацлом.

ofstream: для олерацiй з вихiдним дисковим файлом.

fstream: для вхiдних i вихiдних операцiй з файлом.

Вказанi класи є похiдними вiд класів вiдповiдно istream,ostream,iostream (див. мал. 1). Тому вони унаслiдують всi їх особливостi (манiпулятори, прапорцi, перевантаженi оператори).

12.7.1 Конструктори файлових потокiв

Для кожного з перерахованих вище класiв передбачено 4 конструктори. Вони дозволяють робити слiдуюче:

  • Конструювати об'єкт, не вiдкриваючи файлу:

ifstream();

ofstream();

fstream;

  • Конструювати об'єкт, вiдкрити файл i прикрiпити об'єкт до файлу:

ifstream(const char *name,

int omode=ios::in,

int prot=filebuf::openprot);

ofstream(const char *name,

int omode=ios::out,

int prot=filebuf::openprot);

fstream(const char *name,

int omode,

int prot=filebuf::openprot);

  • Зконструювати об'єкт i прикрiпити його до вже вiдкритого файлу. При цьому вказується дескриптор файлу:

ifstream(int f);

ofstream(int f);

fstream(int f);

  • Конструювати об'єкт, асоцiйований з вказаним буфером; прикрiпити його до вже вiдкритого файлу, вказується дескриптор файла:

ifstream(int f, char *b, int len);

ofstream(int f, char *b, int len);

fstream (int f, char *b, int len);

12.7.2 Вiдкриття файлу

Для вiдкриття файлу в С++ можна використовувати конструктори ifstream, ofstream, fstream:

#include<iostream.h>

#include<fstream.h>

#include<stdlib.h>

#include<ctype.h>

int main(void)

{

char fname[MAX];

cout<<“введіть ім’я вхідного файла”;

cin >>fname;

//відкрити вхідний файл

ifstream ifs (fname);

if (!ifs) {

cout <<"вiдкрити не можна";

return 0;}

cout<<“введіть ім’я вихідного файла”;

cin >>fname;

ofstream ofs (fname);

if(!ofs) {

cout <<"вiдкрити не можна";

return 0;}

char c;

while (ifs && ofs)

{ifs.get(c);

c=toupper(c);

ofs.put(c);}

//завдання виконане

cout<<endl<<“Вихідний файл є копією вхідного у верхньому”

<<”регістрі”<<endl;

return 0;

}

Файл також може бути вiдкритий за допомогою метода open потоку

fstream:

#include<iostream.h>

#include<fstream.h>

#include<stdlib.h>

int main(void)

{//невідкритий об’єкт-потік

fstream fin;

cout<<“введіть iм'я файлу”;

char fname [MAX];

cin >>fname;

fin.open (fname, ios::in);

if (fin) {cout <<"файл вiдкритий успiшно";

fin.close();}

else cout<<"неможливо відкрити файл"<<endl;

return 0;

}

Режим доступу конструюється наступним чином:

enum open.mode{

in=0x01,

out=0x02,

ate=0x04,

app=0x08,

trunc=0x10,

nocreate=0x20,

noreplase=0x40,

binaru=0x80 };

in - для читання;

out - для запису;

ate - вiдкриває та встановлює вказiвник на eof;

app - для дописування в кiнець файлу;

trunc - перезаписує файл, якщо такий файл iснує (якщо нi - створює);

nocrteate - вiдкриває файл, якщо вiн тiльки не iснує;

noreplase - вiдкриває файл, якщо вiн вже iснує;

binary - двiйковий файл.,

Приклад (ілюстрація режимів доступу):

int main(void)

{ //створюється новий файл,якщо тільки він не існує

ofstream ofs (fname,ios::out|ios::noreplase);

//перевірка стану потоку:

if(!ofs)

{cout<<“помилка! Файл”<<fname<<“вже існує”<<endl;

return 0;}

else{

//запис рядка в новий файл

ofs<<“Привіт! Я - новий файл”;

//файл закривається

ofs.close();

// Визначити новий об’єкт

fstream fs;

//відкрити файл та встановити на EOF

ofs.open(fname,ios::out|ios::ate);

fs<<"до якого дописано";

fs.close();

//Знову відкривається як вхідний

fstream ifs (fname);

if(ifs)

{

cout<<“і старий файл сказав:”<<endl;

//вислів старого файла

char line [MAX];

ifs.getline (line,sizeof(line));

cout <<line;

}

else{

cout<<“помилка при повторному відкритті”<<fname<<endl;

}}

return 0;

}

Буферизацією потоку можна керувати за допомогою метода setbuf. Ця функція асоцiює з потоком вказаний буфер:

void setbuf (char*p,int len);

p - адреса,

len - довжина буфера.

В класах файлових потоків існує метод close, який

а) опорожняє потік

б) Закриває закріплений за потоком файл

Якщо при спробі закрити файл відбувається помилка, встановлюється прапорець failbit стану потоку. Деструктр файлового об’єкта (чи його базового класу) повинен автоматично закривати файл.