Программирование >>  Инициализация объектов класса, структура 

1 ... 345 346 347 [ 348 ] 349 350 351 ... 395


фактически прочитано символов: 52

фактически прочитано символов: 52

фактически прочитано символов : 60

фактически прочитано символов : 66

фактически прочитано символов: 63

фактически прочитано символов : 61 фактически прочитано символов: 43

По умолчанию ignore() читает и удаляет один символ из потока, для которого вызвана, но можно и явно задать ограничитель и количество пропускаемых символов. В общем виде ее сигнатура такова:

ignore( streamsize length = 1, int delim = traits::eof )

ignore() читает и отбрасывает length символов из потока или все символы до ограничителя включительно или до конца файла и возвращает объект istreami, для которого вызвана.

Mi рекомендуем пользоваться функцией getline(), а не get(), поскольку она автоматически удаляет ограничитель из потока. Сигнатура getline() такая же, как у get() с тремя аргументами (и возвращает она тоже объект istream, для которого вызвана):

getline(char *sink, streamsize size, char delimiter=\n)

Поскольку и getline() , и get() с тремя аргументами могут читать size символов или меньше, то часто нужно спросить у объекта istream, сколько символов было фактически прочитано. Это позволяет сделать функция-член gcount (): она возвращает число символов, прочитанных при последнем обращении к get() или getline() .

Функция-член write() класса ostream дает альтернативный метод вывода массива символов. Вместо того чтобы выводить символы до завершающего нуля, она выводит указанное число символов, включая и внутренние нули, если таковые имеются. Вот ее сигнатура:

write( const char *sink, streamsize length )

Здесь length определяет, сколько символов выводить. write() возвращает объект класса ostream, для которого она вызвана.

Парной для функции write() из класса ostream является функция read() из класса istream с такой сигнатурой:

read( char* addr, streamsize size )

read() читает size соседних байт из входного потока и помещает их, начиная с адреса addr. Функция gcount() возвращает число байт, прочитанных при последнем обращении к read() . В свою очередь read() возвращает объект класса istream, для которого она вызвана. Вот пример использования getline() , gcount() и write() :



#include <iostream>

int main() {

const int lineSize = 1024;

int lcnt = 0; сколько строк прочитано

int max = -1; дина самой длинной строки

char inBuf[ lineSize ];

читается до конца строки, но не более 1024 символов while (cin.getline( inBuf, lineSize ))

сколько символов фактически прочитано int readin = cin.gcount();

статистика: счетчик строк, самая длинная строка ++lcnt;

if ( readin > max ) max = readin;

cout

<< Строка # << lcnt << \tПрочитано символов: << readin << endl;

cout.write( inBuf, readin).put(\n).put(\n);

cout << Всего прочитано строк: << lcnt << endl; cout << Самая длинная строка: << max << endl;

Когда на вход было подано несколько фраз из романа Германа Мелвилла Моби Дик , программа напечатала следующее:

Строка #1 Прочитано символов: 45

Call me Ishmael. Some years ago, never mind

Строка #2 Прочитано символов: 46

how long precisely, having little or no money

Строка #3 Прочитано символов: 4 8

in my purse, and nothing particular to interest

Строка #4 Прочитано символов: 51

me on shore, I thought I would sail about a little

Строка #5 Прочитано символов: 4 7

and see the watery part of the world. It is a

Строка #6 Прочитано символов: 43

way I have of driving off the spleen, and

Строка #7 Прочитано символов: 28 regulating the circulation.

Всего прочитано строк: 7 Самая длинная строка: 51

Функция-член getline() класса istream поддерживает только ввод в массив символов. Однако в стандартной библиотеке есть обычная функция getline() , которая помещает символы в объект класса string:



возвращает символ в поток putback( char class );

устанавливает указатель на следящий символ потока istream на один символ назад

unget();

возвращает следующий символ (и EOF), но не извлекает его из потока

Вот еще три необходимые нам функции-члена класса istream:

peek();

char ch, next, lookahead;

while ( cin.get( ch ))

switch (ch) { case /:

это комментарий? посмотрим с помощью peek() если да, пропустить остаток строки next = cin.peek();

if ( next == / )

cin.ignore( lineSize, \n );

break;

case >:

проверка на лексему >>= next = cin.peek();

if ( next == > ) {

lookahead = cin.get(); next = cin.peek();

if ( next != = )

cin.putback( lookahead );

...

Следующий фрагмент иллюстрирует использование некоторых из них:

Упражнение 20.4

Прочитайте из стандартного ввода следующую последовательность символов, включая все пустые, и скопируйте каждый символ на стандартный вывод (эхо-копирование):

getline( istream &is, string str, char delimiter );

Эта функция читает не более str::miax size()-1 символов. Если входная последовательность длиннее, то операция завершается неудачно и объект переводится в ошибочное состояние. В противном случае ввод прекращается, когда прочитан ограничитель (он удаляется из потока, но в строку не помещается) либо достигнут конец файла.



1 ... 345 346 347 [ 348 ] 349 350 351 ... 395

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика