
- •Лабораторная работа №10. Потоки ввода-вывода. Файловые операции
- •1 Цель и порядок работы
- •2 Краткая теория
- •2.1 Потоки ввода-вывода
- •2.2 Файловые потоки
- •2.2.1 Режимы открытия файла
- •2.2.2 Закрытие файла
- •2.2.3 Двоичный режим ввода-вывода
- •2.2.4 Чтение символов и строк
- •2.2.5 Ввод-вывод с произвольным доступом
- •2.3 Примеры программ
- •3 Контрольные вопросы
- •4 Задание
- •5 Варианты заданий
Лабораторная работа №10. Потоки ввода-вывода. Файловые операции
1 Цель и порядок работы
Цель работы – ознакомиться с возможностями ввода-вывода языка C++, освоить основные операции работы с файлами.
Порядок выполнения работы:
ознакомиться с описанием лабораторной работы;
получить задание у преподавателя, согласно своему варианту;
написать программу и отладить ее на ЭВМ;
2 Краткая теория
В библиотеке C++ имеется набор классов для управления вводом-выводом. В отличие от функций буферизованного ввода-вывода библиотек C (таких, как printf и scanf, не выполняющих никаких проверок на соответствие аргументов форматной строке) классы потоков C++ безопасны в отношении типа. Ввод-вывод использует механизм перегрузки операций, гарантирующий вызов нужной функции-операции для указанного типа данных. Это главное преимущество потоков языка C++.
2.1 Потоки ввода-вывода
В C++ существует несколько классов потоков:
Класс streambuf управляет буфером потока, обеспечивая базовые операции заполнения, опорожнения, сброса и прочих манипуляций с буфером.
Класс ios является базовым классом потоков ввода-вывода.
Классы istream и ostream – производные от ios и обеспечивают работу потоков соответственно ввода и вывода.
Класс iostream является производным от двух предыдущих и предусматривает функции, как для ввода, так и для вывода.
Классы ifstream, ofstream и fstream предназначены для управления файловым вводом-выводом.
Классы istrstream и ostrstream управляют резидентными потоками (форматированием строк в памяти).
Для работы с потоками необходимо подключить заголовочный файл <iostream>. Кроме того, может потребоваться подключить файлы <fstream> (файловый ввод-вывод), <iomanip> (параметризованные манипуляторы) и <strstream> (форматирование в памяти).
Библиотека ввода-вывода C++ предусматривает четыре предопределенных объекта-потока, связанных со стандартными входным и выходным устройствами.
Таблица 10.1 Предопределенные объекты-потоки C++
Имя |
Класс |
Описание |
cin |
istream |
Ассоциируется со стандартным вводом (клавиатурой). |
cout |
ostream |
Ассоциируется со стандартным выводом (экраном). |
cerr |
ostream |
Ассоциируется со стандартным устройством ошибок (экраном) без буферизации. |
clog |
ostream |
Ассоциируется со стандартным устройством ошибок (экраном)с буферизацией. |
Основными классами ввода-вывода C++ являются istream и ostream. Первый из них перегружает операцию правого сдвига (>>), которая служит в нем для ввода данных и называется операцией извлечения из потока. Класс ostream перегружает соответственно операцию левого сдвига (<<); она применяется для вывода и называется операцией передачи в поток.
Библиотека ввода-вывода предусматривает три способа форматирования: посредством вызова форматирующих функций-элементов, с помощью манипуляторов или путем установки или сброса флагов потока.
Подробней форматирование ввода-вывода рассмотрено в лабораторной работе №2.
Состояние объекта класса ios (и производных от него) содержится в его закрытом элементе _state в виде набора битов (Таблица 11.2).
Таблица 10.2 биты состояния потока
Бит |
Описание |
goodbit |
С потоком все в порядке (на самом деле это не какой-то бит, а 0 — отсутствие битов ошибки). |
eofbit |
Показывает, что достигнут конец файла. |
failbit |
Индицирует ошибку формата или преобразования. После очистки данного бита работа с потоком может быть продолжена. |
badbit |
Индицирует серьезную ошибку потока, связанную обычно с буферными операциями или аппаратурой. Скорее всего, поток далее использовать невозможно. |
Для опроса или изменения состояния потока в классе ios имеется ряд функций и операций.
int rdstate(); Возвращает текущее состояние.
bool eof(); Возвращает true, если установлен eofbit.
bool good(); Возвращает true, если не установлен ни один из битов ошибки.
bool fail(); Возвращает true, если установлен failbit или badbit.
bool bad(); Возвращает true, если установлен badbit.
void clear(int = 0); Сбрасывает биты ошибки (по умолчанию) или устанавливает состояние потока в соответствии с аргументом.
void setstate(int); Устанавливает состояние битов ошибки с соответствии с аргументом.
operator void *(); Возвращает нулевой указатель, если установлен какой-либо из битов ошибки.
bool operator !(); Возвращает true, если установлен какой-либо из битов ошибки.