my << "С++ для чайников — очень хорошая книга"
<< endl ;
if ( my.bad( ) )
{
cerr << "Ошибка записи в файл "
<< fileName
<< endl ;
}
system( "PAUSE" ) ; return 0 ;
}
_________________
280 стр. Часть 5. Полезные особенности
«Все попытки обратиться к объекту класса ofstream, который содержит ошибку, не вызовут никакого действия, пока флаг ошибки не будет сброшен с помощью функции clear( ).»
[Советы]
Деструктор класса ofstream автоматически закрывает файл. В предыдущем примере файл был закрыт при выходе из функции.
Класс ifstream работает для ввода почти так же, как ofstream для вывода, что и демонстрирует приведённый ниже пример.
/* StreamInput — ВВОД ДАННЫХ С ИСПОЛЬЗОВАНИЕМ fstream */
#include <fstream>
#include <cstdlib>
#include <iostream>
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( ).