АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция
|
Классы istream, ostream, iostream и _withassign. Предопределенные потоковые объекты. Флаги статуса ошибок потоков, функции для флагов ошибок
Класс istream
Класс istream, наследник класса ios, выполняет специфические действия по вводу данных — извлечение. Очень легко спутать извлечение и связанное с ним дейст- вие по выводу данных — вставку. Рисунок 12.2 показывает разницу. В табл. 12.6 собраны функции istream, которые вам могут пригодиться.
Таблица 12.6. Функции istream
Функция
| Назначение
| >>
| Форматированное извлечение данных всех основных (и перегружаемых) типов из потока
| get(ch)
| Извлекает один символ в ch
| get(str)
| Извлекает символы в массив str до ограничителя '\n'
| get(str, MAX)
| Извлекает до MAX числа символов в массив
| get(str, DELIM)
| Извлекает символы в массив str до указанного ограничителя (обычно '\n'). Оставляет ограничитель в потоке
| get(str, MAX, DELIM)
| Извлекает в массив str до MAX символов или до символа DELIM. Оставляет ограничитель в потоке
| getline(str, MAX,
DELIM)
| Извлекает в массив str до MAX символов или символа DELIM.
Извлекает ограничитель из потока
| putback(ch)
| Вставляет последний прочитанный символ обратно во входной поток
| ignore(MAX, DELIM)
| Извлекает и удаляет до MAX числа символов до ограничителя включительно (обычно '\n'). С извлеченными данными ничего не делает
| peek(ch)
| Читает один символ, оставляя его в потоке
| count=gcount()
| Возвращает число символов, прочитанных только что встретившимися вызовами get(), getline() или read()
| read(str, MAX)
| (Для файлов.) Извлекает вплоть до MAX числа символов в массив str
| seekg()
| Устанавливает расстояние (в байтах) от начала файла до файлового указателя
| seekg(pos,seek_dir)
| Устанавливает расстояние (в байтах) от указанной позиции в файле до указателя файла. seek_dir может принимать значения ios::beg, ios::cur, ios::end
| pos=tellg(pos)
| Возвращает позицию (в байтах) указателя файла от начала файла
|
Дисковый файл
Рис. 12.2. Файловый ввод/вывод
Там уже встречались некоторые из этих функций, например get(). Большинство из них рассчитаны на работу с объектом cin, обычно представляющим собой поток данных, вводимых с клавиатуры. А последние четыре функции предназначены только для работы с дисковыми файлами.
Класс ostream
Класс ostream предназначен для вывода (вставки в поток) данных. Таблица 12.7 содержит наиболее общие методы этого класса. Как и в предыдущем случае, последние четыре функции работают только с файлами.
Таблица 12.7. Функции ostream
| Функция
| Назначение
| <<
| Форматированная вставка данных любых стандартных (и перегруженных) типов
| put(ch)
| Вставка символа ch в поток
| flush()
| Очистка буфера и вставка разделителя строк
| write(str, SIZE)
| Вставка SIZE символов из массива str в файл
| seekp(position)
| Устанавливает позицию в байтах файлового указателя относительно начала файла
| seekp(position,
seek_dir)
| Устанавливает позицию в байтах файлового указателя относительно указанного места в файле, seek dir может принимать значения ios::beg, ios::cur, ios::end
| pos=tellp()
| Возвращает позицию указателя файла в байтах
| Классы iostream и _withassign
Класс iostream является порожденным по отношению к istream и ostream. Его единственное предназначение — выступать в качестве базового класса для дру- гих специфических классов вида iostream_withassign. У него нет собственных ме- тодов, кроме конструктора и деструктора. Его порожденные классы могут осу- ществлять как ввод, так и вывод данных.
Существуют три класса вида _withassign:
istream_withassign — наследник istream;
ostream_withassign — наследник ostream;
iostream_withassign — наследник iostream.
Эти классы очень похожи на своих предков. Разница лишь в том, что в них, в отличие от породивших их классов, имеются перегружаемые операции при- сваивания, благодаря чему их объекты могут быть скопированы.
Для чего нужны потоковые классы с возможностью копирования и без тако- вой? Вообще-то, это не самая лучшая идея — копировать объекты потоковых классов. Причина заключается в том, что каждый такой объект ассоциирован с конкретным объектом streambuf, включающим в себя область памяти для хра- нения данных объекта. Если вместе с потоковым объектом копировать объект streambuf, возникнет некая неразбериха. Тем не менее бывают случаи, когда важ- но иметь возможность копировать потоки.
Соответственно, классы istream, ostream и iostream созданы так, что их объек- ты нельзя копировать — операторы присваивания и конструкторы копирования сделаны скрытыми. А их наследники с хвостиком _withassign имеют возмож- ность копирования своих объектов.
Предопределенные потоковые объекты
В этой книге уже приводились примеры использования двух предопределенных потоковых объектов, порожденных классами вида _withassign: cin и cout. Обычно они связаны с клавиатурой и монитором соответственно. Еще двумя предопреде- ленными объектами являются cerr и clog:
cin, объект istream_withassign, используется для операций ввода с клавиатуры;
cout, объект ostream_withassign, используется для операций вывода на эк- ран монитора;
cerr, объект ostream_withassign, используется для сообщений об ошибках;
clog, объект ostream_withassign, используется для ведения журнала. Объект cerr часто используется для сообщений об ошибках и программной
диагностики. Поток, посланный в него, немедленно выводится на экран, минуя буферизацию. Этим cerr отличается от cout. К тому же этот поток не может быть перенаправлен (подробнее об этом вы узнаете позже). Поэтому у вас есть не- большой шанс увидеть последнее сообщение неожиданно умершей программы. Другой объект, clog, похож на cerr в том, что также не может быть перенаправ- лен. Но его вывод проходит буферизацию.
Ошибки потоков
До сих пор в нашей книге мы использовали довольно прямолинейный подход к вводу/выводу, используя выражения вида:
cout << "Доброе утро, страна!"; и
cin >> var;
Такой подход, как вы могли заметить, предполагает, что во время процесса ввода/вывода ничего нехорошего не случится. К сожалению, не всегда все прохо- дит гладко, особенно в отношении ввода. Что будет, если наш дорогой пользова- тель введет строчку «девять» вместо числа 9, что будет, если он нажмет Enter, ничего не введя? А что случится, если произойдет скачок напряжения в элек- трической сети или просто возникнут какие-то неполадки с техникой? В про- цессе изучения этой темы мы коснемся всех этих проблем. Множество приемов, которые мы изучим, применимы и к файловому вводу/выводу.
Биты статуса ошибки
Флаги статуса ошибок потоков определяют компонент ios enum, который сообщает об ошибках, произошедших в операциях ввода/вывода. Все эти флаги собраны в табл. 12.8. Рисунок 12.3 показывает, как они выглядят. Для чтения (и даже установ- ки) флагов могут использоваться различные функции ios, как показано в табл. 12.9.
Таблица 12.8. Флаги статуса ошибок
Название
| Значение
| | goodbit
| Ошибок нет (флаги не установлены, значение =0)
| | eofbit
| Достигнут конец файла
| | failbit
| Операция не выполнена (пользовательская ошибка, преждевременный EOF)
| badbit
| Недопустимая операция (нет ассоциированного streambuf)
| hardfail
| Неисправимая ошибка
| Таблица 12.9. Функции для флагов ошибок
Функция
| Назначение
| int=eof();
| Возвращает true, если установлен флаг EOF
| int=fail();
| Возвращает true, если установлены флаги failbit, badbit или hardfail
| int=bad();
| Возвращает true, если установлены флаги badbit или hardfail
| int=good();
| Возвращает true, если ошибки не было
| clear(int=0);
| При использовании без аргумента снимает все флаги ошибок, в противном случае устанавливает указанный флаг, например clear(ios::failbit)
|
Рис. 12.3. Флаги состояния потока
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | Поиск по сайту:
|