- •Лекция №8
- •9. Файлы
- •9.1. Работа с файлами в языке с Открытие и закрытие файла
- •Функция fclose
- •Функция fcloseall
- •Функция feof
- •Функция fscanf
- •Функция freopen
- •Функция ftmpfile
- •Функция fdopen
- •Функция eof
- •Функция fgetpos
- •Функция fileno
- •Функция flushall
- •Функция dup
- •Функция dup2
- •Функции ввода-вывода
- •Функция fgetc
- •Функция getc
- •Функция ungetc
- •Функция fputs
- •Функция fread
- •Функция fwrite
- •Функция fseek
- •Функция fsetpos
- •Функция fstat
- •Функция ftell
- •Открытие и закрытие файлов
- •Класс 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";
}
