
- •Лабораторная работа №3. Работа с файлами через потоки. Теоретическая часть
- •Открытие и закрытие файлов
- •Класс istream
- •Функции get, getline и read
- •Функция возвращения
- •Позиционирование потока
- •Класс ostream
- •Функции вывода put и write
- •Функции класса filebuf
- •Функции класса streambuf
- •Функции класса strstreambuf
- •Определение состояния потока
- •Контрольные вопросы:
- •Порядок выполнения лабораторной работы:
- •Практическая часть. Индивидуальные задания.
Функции класса strstreambuf
Класс strstreambuf управляет символьным буфером, расположенным в динамической памяти. Области ввода и вывода для этого класса равны друг другу, но указатели текущей позиции чтения и записи позиционируются независимо. У этого класса имеются несколько конструкторов:
без параметров – в этом случае в памяти создается буфер неопределенного размера, увеличивающегося или уменьшающегося при необходимости, а выделение и освобождение памяти осуществляется внутри класса strstreambuf;
с одним целочисленным параметром - в этом случае в памяти создается буфер указанного начального размера, увеличивающегося или уменьшающегося при необходимости, а выделение и освобождение памяти осуществляется внутри класса strstreambuf;
с двумя параметрами типа char* и int – в этом случае в качестве буфера используется уже выделенная область памяти указанного размера;
с двумя указателями на функции, выполняющими динамическое выделение и удаление памяти для буфера, когда в этом возникает необходимость.
В классе strstreambuf содержится всего две функции:
freeze() – запрещает или разрешает автоматическое удаление и корректировку размера буфера, если тот создается внутри класса strstreambuf;
str() – возвращает указатель на строку, хранящуюся в буфере.
Пример:
#include <strstrea.h>
#define n 1024
main()
{ char c;
strstreambuf strbu(n);
strbu.sputc(‘A’);
c=strbu.sgetc(); cout<<c;
}
Результат:
А
Как уже было сказано, с указателями областей ввода и вывода в классе strstreambuf можно работать независимо друг от друга. Поэтому когда функция sputc() записывает в буфер символ ‘A’ и переводит указатель позиции записи на следующую позицию, указатель позиции чтения остается в исходной позиции, в результате чего функция sgetc() возвращает только что записанный символ.
Определение состояния потока
С каждым потоком связана внутренняя переменная состояния. В случае возникновения ошибки устанавливаются определенные биты этой переменной в зависимости от категории ошибки. Существует ряд функций, позволяющих определить состояние потока.
Функция |
Назначение |
eof() fail()
bad()
good() rdstate()
clear() |
Возвращает ненулевое значение при обнаружении конца файла Возвращает ненулевое значение при обнаружении какой-либо ошибки в потоке, возможно не фатальной: если функция bad() при этом возвращает 0, то, скорее всего, можно продолжать работу с потоком, предварительно сбросив флаг ios::failbit Возвращает ненулевое значение при обнаружении серьезной ошибки ввода-вывода; в этом случае продолжать работу с потоком не рекомендуется Возвращает ненулевое значение, если биты состояния не установлены Возвращает текущее состояние потока в виде одной из констант: ios::goodbit(нет ошибки), ios::eofbit(достигнут конец файла), ios::failbit(возможно, не критическая ошибка форматирования или преобразования), ios::badbit(критическая ошибка) Задает состояние потока; принимает аргумент типа int, который по умолчанию равен 0, что соответствует сбросу всех битов состояния, в противном случае содержит одну или несколько перечисленных в предыдущем пункте констант, объединенных с помощью операции побитового ИЛИ (|) |
Пример:
#include<fstream.h>
void main()
{ int fp;
ifstream fl("file1.doc",ios::in);
if(fl.eof()) fl.clear(); // состояние потока сбрасывается
if(fl.fail())
cerr<<"ошибка при создании файла\n";
if(fl.good()) cin>>fp;
if(!fl) //другой способ обнаружения ошибки
cerr<<"ошибка при создании файла\n";
}