Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
###Cpp_лкц1_1.09_11_#дляБАК#29_01_12.doc
Скачиваний:
40
Добавлен:
29.04.2019
Размер:
6.42 Mб
Скачать

Глава 10. Потоковые классы

277

} do{

р = Str;

ch = in.peekO; // выяснение типа следующего символа

if(isdigit(ch)){

while(isdigit(*p = in.getO)) р++; // считывание целого

in.putback(*p); // возврат символа в поток

*р = '\0'; // заканчиваем строку нулем

cout « "Number: " « atoi(str);

}

else if(isalpha(ch)){ // считывание строки

while(isalpha(*p = in.getO)) p++;

in.putback(*p); // возврат символа в поток

*р = '\0'; // заканчиваем строку нулем

cout « "String: " « str:

}

else in.getO; // пропуск

cout « endl: } while(Mn.eofO); in.closeO: return 0: } Результат работы программы:

Number: 123 String: this

String: is

String: a

String: test Number: 23 String: Hello

String: there

Number: 99 String: bye

При организации диалогов с пользователем программы при помощью потоков необходимо учитывать буферизацию. Например, при выводе приглашения к вводу мы не можем гарантировать, что оно появится раньше, чем будут считаны данные из входного потока, поскольку приглашение появится на экране только при заполнении буфера вывода:

cout « "Введите х": cin » х:

278

Часть III. Стандартная библиотека

Для решения этой проблемы в basicjios определена функция tie(), которая связывает потоки istream и ostream с помощью вызова вида cin.tie(&cout). После этого вывод очищается (то есть выполняется функция cout.flushO) каждый раз, когда требуется новый символ из потока ввода.

Использовать в одной программе потоки и функции библиотеки С, описанные в <cstdio> или <stdio.h>, не рекомендуется. Если это по каким-либо причинам необходимо, то до выполнения первой операции с потоками следует вызвать описанную в ios_base функцию sync_with_stdio(), которая обеспечит использование общих буферов. Вызов sync_with_stdio(false) разъединяет буфера (это может привести к увеличению производительности).

Ошибки потоков

В базовом классе ios определено иоле state, которое представляет собой состояние потока в виде совокупности битов:

= 0x08

enum io state

{

goodbit

= 0x00

eofbit

= 0x01

failbit

= 0x02

badbit

= 0x04

hardfail

// Нет ошибок

// Достигнут конец файла

// Ошибка форматирования или преобразования

// Серьезная ошибка, после которой

// пользоваться потоком невозможно

// Неисправность оборудования

}:

Состоянием потока можно управлять с помощью перечисленных ниже методов и операций:

int rdstateO — возвращает текущее состояние потока;

int eof() — возвращает ненулевое значение, если установлен флаг

int fail О

int bad()

int goodО

void clear(int = 0)

operator void*()

eofbit;

возвращает ненулевое значение, если установлен один из флагов failbit, badbit или hardfail;

возвращает ненулевое значение, если установлен один из флагов badbit или hardfail;

возвращает ненулевое значение, если сброшены все флаги ошибок;

параметр принимается в качестве состояния ошибки, при отсутствии параметра состояние ошибки устанавливается 0;

возвращает нулевой указатель, если установлен хотя бы один бит ошибки;

operator !()

Далее приведены часто используемые операции с флагами состояния потока.

возвращает ненулевой указатель, если установлен хотя бы один бит ошибки.