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

fstream  fio; //создание файлового потока fio для ввода-вывода

то после выполнения каждого из них файловый поток можно подсоединить к конкретному файлу с помощью компонентной функции open():

fi.open(“File.txt”, ios::in); //входной поток  fi.соединен с файлом File.txt для ввода

fi.close();                          //разорвана связь потока fi с файлом

fi.open(“File2.txt”);          //входной поток  fi.соединен с файлом File2.txt для ввода

Для проверки удачности завершения функции open() используется перегруженная операция !. Если выполнение функции open() завершилось с ошибкой, в булевом выражении поток будет равен значению false.

При обращении к конструктору с явным указанием в параметре имени файла, остальные параметры можно не указывать, они выбираются по умолчанию. Например:

ifstreamfi (“File.1”);

создается входной файловый поток с именем fi для чтения данных; разыскивается файл с названием File.1; если такой файл не существует, то он создается; если дополнительно ввести параметр ios::nocreate,  то файл при его отсутствии на диске, создаваться не будет:

ifstream fi (“File.1”, ios::nocreate);

 проверка успешности открытия потока:

if (!fi) {cerr <<”error  File.1”; exit(1);}

ofstream fo (“File.2”);

создается выходной файловый поток с именем fo для записи данных; если файл с названием File.2 не существует, он будет создан, открыт и соединен с потоком fo; если  файл уже существует, то  предыдущий вариант будет удален и заново создан пустой файл;  проверка:

if (!fo) {cerr <<”error  File.2”; exit(1);}

4. Чтение и запись в файл

После того, как файл открыт, очень легко считать из него или записать в него текстовые данные с помощью оператора  << и (или)  оператора  >> так же, как это делалось для консольного ввода-вывода, только потоки cin и cout надо заменить тем открытым потоком, который связан с файлом. Вся информация в файле хранится в том же формате, как если бы она находилась на экране.

Как правило, файлы, которые будут обрабатываться с использованием операторов << и >>, должны иметь отформатированный текст и открывать их следует в текстовом режиме, а не в двоичном.

5. Закрытие файла

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

При завершении программы функция close() вызывается автоматически и происходит закрытие файла и закрытие потока.

6. Завершение обработки файла

При работе с файлом необходим механизм определения момента завершения работы с ним. Рассмотрим способы, позволяющие проверить это. Пусть имеем входной файловый потокinfileкласса ifstream ( ifstreaminfile;):

o  аварийное состояние файлового потока можно проверить с помощью перегружаемой унарной операции «operator!»,  реализованной в стандартной библиотеке ввода-вывода.

Унарная операция ! может быть перегружена как функция с одним аргументом разными способами: с аргументом-объектом потокового класса когда компилятор видит выражение !infile, он генерирует вызов функции operator!: infile.operator!(), где infile – объект потокового класса; при этом функция-компонент оператор ! возвращает true, если установлен хотя бы один бит ошибки ( badbit, failbit, eofbit):

      • infile >> x;

if (!infile)  {       //перегрузка операции ! аргументом-объектом

//ввод завершился неудачей (установлены биты ошибок)

}

      • if (!(infile >> x)) {                    //обработка неудачного ввода

                                    }   перегруженная операция >> при нормальном завершении  возвращает ссылку на поток (в данном случае, infile), в противном случае, возвращается 0;

      • while (infile>> aa[i++] )    //при вводе значений элементов массива