Типы данных в языке C++__________________________________701

while(infile.get(c))

Третий вариант функции-элемента get принимает три параметра: символьный
массив s, максимальное число символов п и ограничитель delim (по умолчанию
символ перевода строки '\п'). Этот вариант читает символы из входного потока до
тех пор, пока не достигается число символов, на 1 меньше указанного максималь-
ного числа п, или пока не считывается ограничитель. Затем для завершения вве-
денной строки в символьный массив, используемый в качестве буфера программы,
помещается нулевой символ. Ограничитель в символьный массив не помещается, а
остается во входном потоке (он будет следующим считываемым символом). Таким
образом, результатом второго подряд использования функции get явится пустая
строка, если только ограничитель не удалить из входного потока.

Приведенный ранее пример чтения всего файла по строкам в данном случае
реализуется проще:

char s [80] ;

ifstream infile("Test.dat");

iff!infile)
{

ShowMessage("Файл не удается открыть");

return;

}

while(!infile.eof())
(

infile.get(s,80) ;

infile.get() ;

// обработка строки

)

// закрытие файла
infile.close() ;

В данном случае третий аргумент в вызове get не указан. Значит подразумева-
ется по умолчанию ограничитель «\п» и каждый вызов get читает одну строку (по-
дразумевается, что ее длина не более 80 символов). Обратите внимание на то, что
после оператора

infile.get(s,80) ;

добавлен оператор

infile.get ();

Этот оператор удаляет из потока ограничитель. Если этого не сделать, про-
грамма зациклится.

Функция get с тремя параметрами не всегда удобна, поскольку оставляет
ограничитель в потоке, и для повторного вызова функции его приходится убирать
отдельным оператором. Часто более удобна другая функция — getline. Эта функ-
ция действует подобно третьему варианту функции get и помещает нулевой сим-
вол после строки в символьном массиве. Но в отличие от get функция getline уда-
ляет символ ограничитель из потока (т.е. читает этот символ и отбрасывает его);

этот символ не сохраняется в символьном массиве.

С помощью getline рассмотренный выше цикл чтения файла по строкам мо-
жет быть записан следующим образом:

while(!infile.eof())
(
infile.get line(s,80) ;

// обработка строки