Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
LektsiiS.doc
Скачиваний:
88
Добавлен:
13.04.2015
Размер:
815.1 Кб
Скачать

18 Еще о потоках

18.1 Ошибки потока

Все объекты-потоки происходят от класса ios и наследуют элемент данных state. Этот элемент представляет состояние потока в виде битовых полей. Константы состояния перечисляются в классе ios:

goodbit = 0x00, // все в порядке

eofbit = 0x01, // конец файла

failbit = 0x02, // ошибка операции ввода-вывода (ошибка форматирования или преобразования)

badbit = 0x04, // некорректная операция (чтение за пределами файла, ошибка буферизации)

hardfail = 0x80 // неисправимая ошибка (ошибка оборудования)

18.2 Опрос состояния потока

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

int rdstate( ) — возвращает текущее состояние;

int eof( ) — возвращает не 0, если установлен флаг ios::eofbit;

int fail( ) — возвращает не 0, если установлен один из флагов ios::failbit, ios::badbit или ios::hardfail;

int bad( ) — возвращает не 0, если установлен один из флагов ios::badbit

или ios::hardfail;

int good( ) — возвращает не 0, если сброшены все флаги ошибок;

void clear (int=0) — устанавливает параметр в качестве значения поля state;

operator void* ( ) — оператор преобразования типа. Вызывается автоматически, когда поток сравнивается с нулем. Переопределен так, что возвращает NULL, если установлен один из флагов ios::failbit, ios::badbit или ios::hardfail (как fail( ));

int operator !( ) — возвращает не 0, если установлен один из флагов ios::failbit, ios::badbit или ios::hardfail (как fail( ));

Распространенными операциями по проверке состояния флагов являются следующие:

  • проверить, установлен ли флаг F потока S if (S.rdstate( ) & ios::F)...

  • сбросить только флаг F S.clear (rdstate( ) &~ios::F)

  • установить только флаг F S.clear (rdstate( ) | ios::F)

  • установить флаг F, а другие сбросить S.clear (ios::F)

  • сбросить все флаги S.clear( )

18.3 Файловый ввод-вывод с применением потоков

Библиотека потоков содержит 3 класса, предназначенных для ввода и вывода в файлы:

  • ifstream — для операций с входным файлом (наследник istream),

  • ofstream — для операций с выходным файлом (наследник ostream),

  • fstream — для входных и выходных операций (наследник iostream).

Эти классы наследуют все особенности потоковых классов, изложенные ранее. Интерфейс классов описан в заголовочном файле fsream.h.

18.4 Конструкторы файловых потоков

Для каждого из трех файловых классов предусмотрены 4 конструктора. Рассмотрим их на примере класса fstream.

fstream( ) — конструирует поток, не открывая файла.

fstream(const char* name, // имя файла

int omode, // режим открытия

int = filebuf::openprot // защита файла

) — конструирует поток, открывает файл и ассоциирует его с потоком.

fstream(int f // дескриптор файла

) — конструирует поток, и ассоциирует его с уже открытым файлом.

fstream(int f,

char* buf, // буфер

int len // размер буфера

) — делает то же, что предыдущий конструктор, но потоку назначается буфер.

Аддитивные константы режимов открытия файла перечислены в классе ios.

in = 0x01 // для чтения

out = 0x02 // для записи

ate = 0x04 // установить указатель на конец файла

app = 0x08 // для добавления в конец

trunc = 0x10 // если файл существует, обрубить

nocreate = 0x20 // если файл не существует, ошибка открытия

noreplace =0x40 // если файл уже существует, ошибка открытия

binary = 0x80 // двоичный файл

Для класса ifstream по умолчанию параметр omode = ios::in.

Для класса ofstream по умолчанию параметр omode = ios::out.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]