«Ещё раз напомню, что при чтении из потока в состоянии ошибки ничего считано не будет. Более того, буфер останется неизменным, так что программа может прийти к ошибочному выводу, что прочитано такое же значение, как и перед этим. Кстати, при наличии ошибки функция eof( ) никогда не вернёт true.»
[Советы]
Вывод этой программы имеет следующий вид.
Введите имя файла с целыми числами
testfile
Невозможно открыть testfile
Введите имя файла с целыми числами
integers.txt
123
456
234
654
4363
48923
78237
Press any key to continue...
►Прямое чтение из потока...282
Операторы вставки и извлечения обеспечивают удобный механизм чтения форматированного ввода. Однако бывают ситуации, когда надо просто прочесть нечто из потока, не заботясь о формате входной информации. В этом случае вам могут помочь два метода. Функция-член getline( ) возвращает строку символов, считанную из потока до появления в нём некоторого символа-терминатора — по умолчанию символа новой строки. Данная функция удаляет терминатор из строки, но не делает никаких других попыток каким-либо образом изменить или интерпретировать вводимую строку.
_________________
282 стр. Часть 5. Полезные особенности
Вторая функция-член read( ) носит ещё более фундаментальный характер. Она просто считывает указанное вами количество символов ( либо меньшее, если в процессе чтения достигается конец файла ). Функция gcount( ) возвращает количество реально считанных символов.
Далее приведена демонстрационная программа, которая использует описанные функции для чтения произвольного файла и вывода его на дисплей.
/* FileInput — чтение блока данных из файла */
#include <fstream>
#include <cstdlib>
#include <iostream>
using namespace std ;
ifstream* openFile( istream& input )
{
for ( ; ; )
{
/* Открытие определённого пользователем файла */
char fileName[ 80 ] ;
cout << " Введите имя файла" << endl ;
/* Чтение вводимого пользователем имени ( не более 80 символов, что обеспечивает невозможность переполнения буфера ) */
input.getline( fileName , 80 ) ;
/* Открываем файл для чтения; если его нет — заново его не создаём */
ifstream* pFileStream = new ifstream( fileName ) ;
if ( pFileStream -> good( ) )
{
return pFileStream ;
}
cerr << "Невозможно найти файл " << fileName << endl ;
}
return 0 ;
}
int main( int nNumberofArgs , char* pszArgs[ ] )
{
setlocale ( LC_ALL , ".1251" ) ; /* печать русских текстов */
/* Получаем поток */
ifstream* pFileStream = openFile( cin ) ;
/* Читаем его блоками по 80 байт */
char buffer[ 80 ] ;
while ( !pFileStream -> eof( ) && pFileStream -> good( ) )
{
/* Чтение блоками; gcount( ) возвращает количество реально считанных байт */
pFileStream -> read( buffer , 80 ) ;
int noBytes = pFileStream -> gcount( ) ;
/* Работа с блоком */
for ( int i = 0 ; i < noBytes ; i++ )
{
cout << buffer[ i ] ;
}
}
/* Пауза для того, чтобы посмотреть на результат работы программы */
system( "PAUSE" ) ; return 0 ;
}