Библиотека fstream – работа с файлами 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Библиотека fstream – работа с файлами



Рассмотренные в главе 1 п.9 классы потокового ввода istream и вывода ostream входят в иерархию классов, показанную на рисунке ниже.

В библиотеке fstream имеется 3 класса для работы с файлами:

ifstream – потоковый ввод из файла, данные только последовательно читаются, для чтения можно использовать операцию >>;

ofstream – потоковый вывод в файл, данные только последовательно записываются, для вывода можно использовать операцию <<;

fstream – потоковый ввод-вывод в файл, данные и читаются, и записываются в конец файла, используются операции >>, << соответственно.

В каждом из этих классов имеются конструкторы с аргументом char * для того, чтобы связать поток с конкретным файлом и разрешить работу с ним. Кроме конструктора связать файл с потоком можно функцией класса open() – открыть файл. Она перегружена в любом из этих классов. Функция close() закрывает файлы: формирует признак конца файла EOF (End Of File) для выходных файлов и запрещает потоку работать с ними.

 

Рассмотрим на примере работу с файлами.

Пример. Пусть имеется файл целых чисел с именем “f1.dat”. Читая числа из файла, положительные перепишем в файл с именем “f2.dat”.

 

#include  <fstream.h>

void  main()

{ifstream  f(“f1.dat”); // конструктор с аргументом char * связывает файл с именем “f1.dat” с потоком ввода f

// или можно так:  ifstream  f; f.open(“f1.dat”);

ofstream  g(“f2.dat”); // конструктор с аргументом char * связывает поток вывода g с файлом “f2.dat”.

// Если такой файл уже был, то он будет разрушен.

int  x;

 while (f >> x) // прочитать число из файла “f1.dat” и записать его в x. Если все числа прочитаны,

// т.е. файл закончился, то операция возвращает 0 (NULL)

 if (x > 0)  g << x << ’ ‘; // записать число x > 0 в файл “f2.dat”

f.close(); g.close(); // файлы закрыты, больше их использовать нельзя!

}

 

Проверку на конец файла можно делать и специальной функцией-предикатом eof(). Она возвращает истину, если файл закончился, и ложь, если нет. Используя функцию eof(), цикл можно организовать таким образом:

 

while (!f.eof()) {... }

 

По умолчанию файлы считаются текстовыми, т.е. если это числа, то они преобразуются в символьный вид при выводе и из символьного в числовой при вводе.

Конструкторы этих классов, а также функция open(), могут иметь дополнительный второй аргумент, конкретизирующий способ работы с файлом (атрибут). Атрибут задается как перечислимый тип (enum), определенный в базовом классе ios.

 

Перечислим несколько часто используемых атрибутов:

ios::in – открыть файл для ввода (для объектов ifstream по умолчанию),

ios::out – открыть файл для вывода (для объектов ofstream по умолчанию),

ios::app – открыть файл для записи в конец файла, если файла еще нет – создается,

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

Если для файла надо задать несколько атрибутов, то они связываются операцией логическое «или» (|), которая трактуется как объединение атрибутов.

Например, открыть двоичный файл для дополнения можно так:

 

ofstream f(“ff.dat”, ios::app | ios::binary);

 

Приведем еще примеры работы с файлами:

 

void   main()

 {int  i;

ofstream  f; f.open("f4.dat"); // для дополнения ios::app); или ofstream f("f4.dat");

 for (i = 0; i < 20; i++)

f << random(100) << ' ';

f.close();

ofstream  g[3] = {"g1.dat", "g2.dat", "g3.dat"}; // 3 файла для вывода

g[0] << 555 << ' ';

g[1] << "666 + 777";

g[2] << 45.78;

 for(i = 0; i < 3; i++)

g[i].close();        // закрыли

  ofstream  *t = new  ofstream [2]; // массив из 2-х потоковых файлов вывода, но связи с реальным файлом нет

t[0].open("ah.dat");       // связать с

t[1].open("oh.dat");       // конкретными файлами

t[0] << "Ах!";                  //запись строки в файл

t[1] << "Ох!";

t[0].close(); t[1].close(); // закрыли файлы

ifstream  r("ah.dat");     // открыли поток r для чтения

char s[15];

f.open("plus.txt");    // открыли для записи выходной поток f, используется повторно

r >> s; f << s; // чтение строки до ' ' из потока r и запись в поток f

// r.getline(s,30); //чтение всей строки

cout << s;

r.close();          // закрыли работу с файлом "ah.dat"

r.open("oh.dat");    // открыли повторно входной поток r для чтения из файла "oh.dat"

r >> s; f << s;    // прочитали строку из файла "oh.dat" и записали ее в файл "plus.txt"

f.close(); r.close(); // закрыли оба файла

ifstream  *ff = new  ifstream("plus.txt"); // открыли поток ввода в динамической памяти для

// чтения из файла “plus.txt”  

(*ff) >> s;                // прочитали из него строку

cout << "s = " << s; // вывели на экран

ff –> close();          // закрыли

fstream   z("plus.txt", ios::in | ios::out);// открыли поток ввода-вывода

z >> s; cout << s;   // прочитали из него строку

z << "Ух!";        // записали в конец его новую строку

z.close();         // закрыли файл “plus.txt”

z.open("plus.txt", ios::in); // и открыли его только для чтения

z >> s;              // прочитали строку

cout << endl << s; // и вывели на экран

z.close();      // закрыли

  delete [t]; delete ff;

}


 



Поделиться:


Последнее изменение этой страницы: 2021-12-07; просмотров: 99; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.138.33.87 (0.01 с.)