Язык С++ для системного программирования. Имена-этикетки. Класс как область действия, страница 19

  • ifstream - для операций с входным дисковым файлом;
  • ofstream- для операций с выходным дисковым файлом;
  • fstream - для входных и выходных операций с файлом.

Эти классы являются производными соответственно от istream, оstream и iostream. Таким образом, они наследуют все их функциональные особенности, в т.ч. перегруженные операции << и >> для встроенных типов.

24.2 Конструкторы файловых потоков

Для каждого из трех классов файловых потоков предусмотрено по четыре перегруженных конструктора. Рассмотрим два из них, применяемых наиболее часто. Это, в первую очередь, три пустых конструктора:

http://sumdu.telesweet.net/doc/lections/Sistemnoe-programmirovanie/31196/img/table.gif

Они конструируют объекты, не открывая файла. Например, ifstream ifs; ofstream ofs; fstream f1,f2;

Три вторых конструктора позволяют конструировать объект, открыть файл и прикрепить объект к файлу. Их заголовки имеют вид:

ifstream(const char *name,int mode=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);

24.3 Открытие файла

Чтобы открыть файл, можно использовать конструкторы ifstream, ofstream или fstream. Автоматически вызываются вторые конструкторы. Для ifstream и ofstream обязательными являются лишь имена файлов. Остальные два параметра берутся по умолчанию. При вызове fstream необходимо обязательно передать первые два параметра: имя файла и режим его работы.

Примеры.

ifstream ifs1("ish.dan");

ofstream of1("rezult.dan");

ofstream of2("rezult2.txt",ios::app);

Файл rezult2.txt используется для дозаписи в конец файла (append).

fstream fil1("file1.txt",ios::in);

file1.txt - для чтения.

fstream fil2("file2.dan",ios::out);

fstream fil3("file3.dan",ios::app);

Файлы file2.dan и file3.dan созданы соответственно для записи и для дозаписи в конец файла.

Открыть файл можно также с помощью функции -члена open() класса ios. Ее прототип имеет вид:

filebuf*open(const char*name,int mode, int prot=filebuf::openprot);

При ее вызове обязательными являются только первые два параметра: имя файла и режим его работы (доступа). Режимы доступа задаются перечисляемыми битовыми масками в классе ios.

еnum open_mode

 {

in=0x01://open for reading

out=0x02://open for writing

ate=0x04://seek to end of file upon original open

app=0x08://append mode

trunc=0x10://trancate file if already exist

nocreate=0x20:// open fails if file doesn't exist

noreplace=0x40:// open fails if file alreadyexists

binary=0x80:// binary file

 };

Примеры.

Предположим, с помощью пустого конструктора были созданы объекты:

 fstream fin, fout;

fin.open("ish.dan", ios::in);

fout.open("rez.dan", ios::out);

Эти два файловых объекта открыты соответственно для чтения и для записи. Можно указывать несколько режимов доступа через вертикальную линию. Например:

fout.open("rez.dan",ios::out|ios::ate);

24.4 Закрытие файла

В классах файловых потоков имеется метод close, который опорожняет поток и закрывает закрепленный за потоком файл. Примеры:

fin.close( );

fout.close( );

Предполагается, что деструктор файлового объекта (или его базового класса) автоматически закрывает файл.

Примеры программ работы с файлами.

Пример 1 Табулирование функции. Исходные данные размещаются в файле ish.dan, а результаты будут заноситься в файл rez.dan.

#include <iostream.h>

#include <fstream.h>

#include <math.h>

#include <stdlib.h>

void main ( )

{

ifstream fin ("ist. dan");

if(fin)

{

cout<< "не открылся файл ish. dan" <<'\ n ';

exit(1);

}