►Прямое чтение из потока...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 ;

    }

_________________ 

283 стр. Глава 24. Использование потоков ввода-вывода

В данной программе сначала вызывается функция openFile( ), открывающая файл, имя которого вводится пользователем. Здесь есть два интересных момента. Во-первых, функция читает объект istream так же, как ранее — cin ( функция main( ) передаёт функции openFile( ) поток cin в качестве аргумента ). Однако данная функция может использовать произвольный поток istream без каких-либо модификаций.

Во-вторых, функция openFile( ) использует для чтения из потока функцию getline( ), одним из аргументов которой является размер буфера для ввода информации. Функция getline( ) не может считать больше указанного количества символов.

«Использование этой функции для чтения информации безопаснее чтения информации в массив символов при помощи оператора извлечения, так как оператор извлечения может прочесть больше символов, чем может поместить входной буфер.»

[Советы]

Функция main( ) читает открытый файл блоками по 80 символов, проверяя реально считанное количество символов с помощью функции gcount( ). Для вывода прочитанной информации используется обычный оператор вставки в поток. Вот как может выглядеть вывод данной программы.

    Введите имя файла

integers.txt

    123 456 234 654

    4363 48923 78237 dhbj

    dnbsd

    93276823 4329

    Press any key to continue...

Более 800 000 книг и аудиокниг! 📚

Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением

ПОЛУЧИТЬ ПОДАРОК