Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторная работа3.doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
147.46 Кб
Скачать

Функции класса 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";

}