Нут) или 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; // Поток для подсчета целых чисел.