«Все попытки обратиться к объекту классаofstream , который содержит ошибку, не вызовут никакого действия, пока флаг ошибки не будет сброшен с помощью функцииclear( ) .»
[ Советы ]
Деструктор класса ofstream автоматически закрывает файл. В предыдущем примере файл был закрыт при выходе из функции.
Класс ifstream работает для ввода почти так же, как ofstream для вывода, что и демонстрирует приведённый ниже пример.
/* StreamInput — ВВОД ДАННЫХ С ИСПОЛЬЗОВАНИЕМ fstream */
#include
#include
#include
using namespace std ;
ifstream* openFile( )
{
ifstream* pFileStream = 0 ;
for ( ; ; )
{
/* Открытие файла, указанного пользователем */
char fileName[ 80 ] ;
cout << "Введите имя файла с целыми числами"
<< endl ;
cin >> fileName ;
/* Открываем файл для чтения; не создавать файл, если его не существует */
pFileStream = new ifstream( fileName ) ;
if ( pFileStream -> good( ) )
{
break ;
}
cerr << "Невозможно открыть " << fileName << endl ;
delete pFileStream ;
}
return pFileStream ;
}
int main( int nNumberofArgs , char* pszArgs[ ] )
{
setlocale ( LC_ALL , ".1251" ) ; /* печать русских текстов */
/* Получение файлового потока */
ifstream* pFileStream = openFile( ) ;
/* Остановиться по достижению конца файла */
while ( !pFileStream -> eof( ) )
{
/* Чтение значения */
int nValue = 0 ;
( *pFileStream ) >> nValue ;
/* Останов при ошибке чтения ( например, считывается не целое число, или считан символ новой строки, после которого ничего нет */
if ( pFileStream -> fail( ) )
{
break ;
}
/* Вывод считанного значения */
cout << nValue << endl ;
}
delete pFileStream ;
system( "PAUSE" ) ; return 0 ;
}
_________________
281 стр. Глава 24. Использование потоков ввода-вывода
Функция openFile( ) запрашивает у пользователя имя открываемого файла и создаёт поток с этим именем. Создание объекта ifstream автоматически открывает файл для ввода. Если файл открыт корректно, функция возвращает указатель на объект ifstream , который используется для чтения. В противном случае объект удаляется и повторяется попытка открыть файл. Единственный способ выйти из цикла — ввести правильное имя файла или завершить выполнение программы.

«Не забывайте о необходимости удаленияpFileStream , если вы не смогли открыть файл. Это позволит избежать утечек памяти.»
[ Советы ]
Программа считывает целые числа до тех пор, пока не дойдёт до конца файла ( проверяется при помощи функции-члена eof( ) ) или не произойдёт ошибки чтения ( функция fail( ) ). Попытка прочитать информацию с помощью объекта класса ifstream с установленным флагом ошибки приведёт к немедленному возврату без считывания данных. Для сброса флага ошибки используйте функцию clear( ) .

«Ещё раз напомню, что при чтении из потока в состоянии ошибки ничего считано не будет. Более того, буфер останется неизменным, так что программа может прийти к ошибочному выводу, что прочитано такое же значение, как и перед этим. Кстати, при наличии ошибки функцияeof( ) никогда не вернётtrue .»
[ Советы ]
Вывод этой программы имеет следующий вид.

Введите имя файла с целыми числами
testfile
Невозможно открыть testfile
Введите имя файла с целыми числами
integers.txt
123
456
234
654
4363
48923
78237
Press any key to continue...
►Прямое чтение из потока...282
Операторы вставки и извлечения обеспечивают удобный механизм чтения форматированного ввода. Однако бывают ситуации, когда надо просто прочесть нечто из потока, не заботясь о формате входной информации. В этом случае вам могут помочь два метода. Функция-член getline( ) возвращает строку символов, считанную из потока до появления в нём некоторого символа-терминатора — по умолчанию символа новой строки. Данная функция удаляет терминатор из строки, но не делает никаких других попыток каким-либо образом изменить или интерпретировать вводимую строку.
Читать дальше