Файлы. Общая концепция организации ввода-вывода данных в С++. Средства класса ios, обеспечивающие точную настройку вывода, страница 18

//из потокаinfile, цикл работает, «пока все хорошо»; цикл завершится при создании ситуации конца файла (нажаты клавиши Ctrl+Z – поток переводится в состояние eof) при появлении символа, не соответствующего типу вводимой переменной (поток переводится в состояние fail);

      • while (infile) {                                      //пока нет ошибок

}  в случае, когда поток сравнивается с 0, всякий раз неявно вызывается компонентная функция operatorvoid*(), которая возвращает false, если установлен хотя бы один бит ошибки; с аргументом булевского типа (в традиционном контексте)

к этому случаю относится вызов компонентной функции eof, с помощью которой можно определить достигнут ли при чтении из файла его конец: функция eof возвращает true, если был достигнут конец файла, и false – в противном случае:

      • infile.getline (line, len);   //чтение строки line из входного потока infile

while (!infile.eof())           // пока «не конец»  файла

                        {cout << s << endl;

infile.getline(line, len);     //чтение в строку line из потока infile

                   }

      • или (с помощью бесконечного цикла):

while (true)           

                   { infile.getline(line, len);     //чтение в строку s из потока infile

if (infile.eof()) break;    //если «конец файла»

cout << line<< endl;

                   }  

      • с использованием явного вызова метода get: 

int nl =0;

           while (infile.get(ch))  //или while (ch=infile.get() && ch!=EOF)

{if (ch==’\n’) nl++;

outfile.put(ch);} – подсчет количества символов ‘\n’, которым оканчиваются вводимые строки;

      •  с использованием явного вызова метода getline (пример из лекции 15):

                while (fin.getline (line, len)) {                                                                              if (strstr(line, word)) {                                                                                          cout << “YES!” << endl; return 0;}

}

Надпись: Cостояние eof возникает только при первой попытке чтения  
после последнего байта файла.
 


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

Примеры использования текстовых файлов:

1. Вывод в текстовый файл и считывание из него

В программе создается текстовый файл для вывода, в который записываются символ, несколько чисел, 2 строки информации, и файл закрывается. Затем файл открывается для считывания, и записанная там информация выводится на экран:

#include <fstream.h>

#include <iostream.h>

int main()

{

char ch = ‘x’;

int j=77;

double d = 6.02;

char str1[]= “Minsk”; 

char str2[]= “Brest”;

ofstreamoutfile (“fdata.txt”);   //создается объект-поток  outfile класса ofstream

//при этом резервируются ресурсы для файла, и открывается доступ к нему

if (!outfile) {                          //проверка открытияпотока outfile  для вывода

cout << ”error”;

return 1;

}

outfile << ch <<j      // x77

<< ‘ ‘                  //вывод пробела между числами

<< d                    //x77 6.02

<< str1               // x77  6.02Minsk

<< ‘ ‘                     //вывод пробела между строками

<< str2;               // x77  6.02 Minsk Brest

          outfile.close();                //закрытие файла  является обязательным только при закрытии                                                // потока раньше конца области его видимости

return 0;             //при завершении программы  объект outfile вызывает свой деструктор,                            //который закрывает файл, так что явным образом это делать не приходится.

}

Чтениесодержимого созданногофайла:

#include <fstream.h>

#include <iostream.h>

int main()

{

char ch ;

int j;

double d;

char str1[30];

char str2[30];