Узнать, находится ли в данный момент флаг в состоянии True (конец файла достиг-

Нут) или False (конца файла пока нет).

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

EOF сбрасывается в значение False (даже если файл пуст). Но, если ifstream

"in_stream" сейчас расположен в конце файла, и флаг EOF равен False, то после вы-

Зова

in_stream.get(ch);

переменная "ch" окажется в неопределенном состоянии, а флагу EOF будет присвоено

Значение True. Если флаг EOF равен True, то программа не должна пытаться выпол-

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

Допустим, программа находится с состоянии, показанном на рис. 10.

46

Рис. 10. Состояние программы после чтения предпоследнего символа из файла.

Тогда после выполнения оператора

in_stream.get(ch);

Программа перейдет в состояние, изображенное на рис. 11.

Рис. 11. Состояние программы после чтения последнего символа из файла.

Теперь логическое выражение

In_stream.eof()

будет иметь истинное значение True. Если снова выполнить чтение символа:

in_stream.get(ch);

То в результате получится состояние, показанное на рис. 12.

Рис. 12. Состояние программы после операции чтения символа при установ-

Ленном флаге EOF.

Ниже приведена простая программа для копирования текстового файла

"Lecture_4.txt" одновременно и на экран, и в другой файл "Copy_of_4.txt". Для

прекращения копирования применяется вызов функции "eof()". Обратите внимание

на цикл "while". Цикл с префиксным условием (предусловием) "while" является уп-

рощенным вариантом цикла "for". У цикла "while" в круглых скобках "()" нет опе-

Раторов инициализации и изменения значений (подробно эти циклы рассматриваются

В следующей лекции).

#include <iostream.h>

#include <fstream.h>

Int main()

{

char character;

ifstream in_stream;

ofstream out_stream;

47

in_stream.open("Lecture_4.txt");

out_stream.open("Copy_of_4.txt");

in_stream.get(character);

while (!in_stream.eof())

{

cout << character;

out_stream.put(character);

in_stream.get(character);

}

out_stream.close();

in_stream.close();

return 0;

}

Программа 5.1.

Передача потоков функциям в качестве параметров

Потоки можно использовать в качестве параметров функций, но их обязатель-

но надо передавать по ссылке (а не по значению). Ниже приведен усовершенствован-

Ный вариант программы 5.1, в котором копирование выполняется специальной функ-

цией "copy_to(...)".

#include <iostream.h>

#include <fstream.h>

void copy_to(ifstream& in, ofstream& out);

// Главная функция

Int main()

{

ifstream in_stream;

ofstream out_stream;

in_stream.open("Lecture_4.txt");

out_stream.open("Copy_of_4.txt");

copy_to(in_stream, out_stream);

out_stream.close();

in_stream.close();

return 0;

}

// Конец главной функции

// Функция для копирования файла в другой файл и на экран

void copy_to(ifstream& in, ofstream& out)

{

char character;

in.get(character);

while (!in.eof())

{

cout << character;

out.put(character);

48

in.get(character);

}

}

// Конец функции

Программа 6.1.

7. Операторы ввода/вывода ">>" и "<<"

До сих пор рассматривались способы записи и чтения из файлов отдельных

Символов. На нижнем уровне, скрытом внутри классов ofstream and ifstream, объ-

Екты этих классов всегда работают с файлами как с последовательностями символов.

Поэтому данные других типов ("int", "double" и др.) для записи в файл должны быть

Преобразованы в последовательность символов. При чтении из файла эти последова-

Тельности должны быть преобразованы обратно.

Некоторые преобразования типов данных автоматически выполняются опера-

торами ">>" и "<<" (в предыдущих лекциях они часто использовались для ввода с кла-

виатуры и вывода на экран). Например, из состояния, показанного на рис. 13:

Рис. 13. Состояние программы после открытия файла вывода (после подклю-

Чения потока вывода к файлу).

С помощью оператора

out_stream << 437 << ' ';

Программа перейдет в новое состояние, изображенное на рис. 14.

Рис. 14. Состояние программы после записи в поток вывода целого значения

"437" и пробела.

При использовании операторов ">>" и "<<" обязательно надо после каждого за-

Писанного значения записывать еще как минимум один символ ' ' (пробел) или слу-

жебный символ '\n' (маркер конца строки). Это гарантирует, что элементы данных

Будут корректно отделены в файле друг от друга, и их можно будет извлекать оттуда

с помощью оператора ">>". Например, в состоянии, показанном на рис. 15:

49

Рис. 15. Состояние программы в некоторый момент времени, когда текущая

Позиция потока ввода установлена на пробел.

если "n" является переменной типа "int" и имеет значение 10, то выполнение опера-

Тора

in_stream >> n;

Приведет к состоянию, показанному на рис. 16.

Рис. 16. Состояние программы после чтения из потока ввода целого значения

"437".

Обратите внимание, что оператор ">>" перед числом 437 пропустил пробел ' '.

Этот оператор всегда пропускает пробелы, независимо от типа считываемых данных

(даже при чтении символов).

Работа с операторами ">>" и "<<" продемонстрирована в программе 7.1. Снача-

ла она создает файл "Integers.txt", записывает в него целые числа 51, 52, 53, 54 и

А затем считывает эти числа из файла.

#include <iostream.h>

#include <fstream.h>

Int main()

{

char character;

int number = 51;

int count = 0;

ofstream out_stream;

Ifstream in_stream1; // Поток для подсчета целых чисел.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: