Цель лекции: изучить использование алгоритмов обработки элементов файла в решении задач и научится приемам решения задач на обработку элементов файла на языке C++.
Потоки для работы с файлами создаются как объекты следующих классов:
ofstream – для вывода (записи) данных в файл;
ifstream – для ввода (чтения) данных из файла;
fstream – для чтения и для записи данных (двунаправленный обмен).
Чтобы использовать эти классы, в текст программы необходимо включить дополнительный заголовочный файл fstream.h. После этого в программе можно определять конкретные файловые потоки, соответствующих типов.
Создание файлового потока (объекта соответствующего класса) связывает имя потока с выделяемым для него буфером и инициализирует переменные состояния потока. Так как перечисленные классы файловых потоков наследуют свойства класса ios, то и переменные состояния каждого файлового потока наследуются из этого базового класса. Файловые классы являются производными от классов ostream (класс ofstream ), istream (класс ifstream ), stream (класс fstream ), они поддерживают описанный в предыдущих шагах форматированный и бесформатный обмен с файлами. Однако прежде чем выполнить обмен, необходимо открыть соответствующий файл и связать его с файловым потоком.
Открытие файла в самом общем смысле означает процедуру, информирующую систему о тех действиях, которые предполагается выполнять с файлом. Работая с файловыми потоками с помощью библиотек ввода-вывода языка С++, удобнее пользоваться компонентными функциями соответствующих классов.
Большинство средств управления потоковым вводом-выводом сосредоточены в классе ios, который является базовым для ostream и istream. По сути здесь находится управление связью между istream или ostream и буфером, используемым для операций ввода-вывода. Именно класс ios контролирует работу буфера обмена: как символы заносятся и как они считываются.
Класс ios (iostream.h)
Обеспечивает общие операции для ввода и вывода. Производные от него классы ( istream, ostream, iostream ) специализируют ввод-вывод с помощью операций форматирования высокого уровня. Класс ios является базовым для istream, ostream, fstreambase и strstreambase.
Флаги форматирования – двоичные коды, управляющие форматом выводимых значений. В заголовочном файле iostream.h определено следующее перечисление, задающее флаги форматирования.
Значения флагов форматирования файла iostream.h
|
|
|
skipws |
0х0001 |
Пропускает при вводе пробелы и разделители. |
left |
0х0002 |
Выравнивание вывода влево. |
right |
0х0004 |
Выравнивание вывода вправо. |
internal |
0х0008 |
Дополнение после знака или указателя основания. |
dec |
0х0010 |
Десятичное преобразование. |
oct |
0х0020 |
Восьмеричное преобразование. |
hex |
0х0040 |
Шестнадцатеричное преобразование. |
showbase |
0х0080 |
Показывает в выводе индикатор основания. |
showpoint |
0х0100 |
Показывает при выводе с плавающей точкой десятичную точку. |
uppercase |
0х0200 |
Преобразует шестнадцатеричный вывод в верхний регистр. |
showpos |
0х0400 |
Выводит с положительными числами символ '+'. |
scientific |
0х0800 |
Добавляет к числам с плавающей точкой суффикс с показателем степени (E). |
fixed |
0х1000 |
Для вывода чисел с плавающей точкой использует десятичную фиксированную точку. |
unitbuf |
0х2000 |
После включения выводит все потоки. |
stdio |
0х4000 |
После включения выводит stdout и stderr. |
Фактически в этом списке содержатся имена констант, определяющие флаги соответствующих назначений. Коду формата соответствует целый тип long. Изменить состояние флагов формата можно с помощью функции класса ios, имеющей прототип
Например, чтобы установить флаг showbase в активный режим (включить) применительно к стандартному потоку вывода cout, используется оператор
cout.setf(ios::showbase);
Для установки флагов можно использовать побитовые операции. Например:
cout.setf(ios::left|ios::hex);
В результате включатся одновременно флаги, управляющие выравниванием по левому краю и выводом целых значений в шестнадцатеричной системе.
Функции класса ios
Функция |
Прототип |
Описание |
bad |
int bad(); |
Ненулевое значение в случае ошибки. |
bitalloc |
static long bitalloc(); |
Получает новый флаг битового набора. Возвращаемое значение может использовать для установки, очистки и проверки флаги. Это флаги форматирования, определяемые пользователем. |
eof |
int eof(); |
В случае достижения конца файла возвращает ненулевое значение. |
fail |
int fail(); |
Не 0 при неуспешном выполнении операции с потоком. |
fill |
char fill(); |
Возвращает текущий символ-заполнитель потока. |
char fill(char); |
Заменяет значением параметра символ заполнения потока; возвращает ранее установленное значение символа заполнения. |
flags |
long flags(); |
Возвращает текущее значение флагов форматирования. |
long flags(long); |
Устанавливает флаги форматирования по значению параметра; возвращает ранее установленное значение флагов. |
good |
int good(); |
Возвращает ненулевое значение, если не установлен ни один флаг (ошибок нет). |
presicion |
int presicion(); |
Возвращает текущую точность числа с плавающей точкой. |
int presicion(int); |
Устанавливает точность вещественных чисел с плавающее точкой по значению параметра; Возвращает предыдущее значение параметра. |
rdbuf |
streambuf* rdbuf(); |
Возвращает указатель на streambuf, назначенный для данного потока. |
rdstate |
int rdstate(); |
Возвращает текущее состояние потока. |
setf |
long setf(long); |
Устанавливает флаги по значению параметра; возвращает ранее установленные флаги. |
sync_with_stdio |
sync_with_stdio; |
Смешивает файлы stdio и потоки iostreams. В новой программе этого использовать не следует. |
unseft |
long unseft(long); |
Очищает биты состояния потока, отмеченные параметром; возвращает предыдущее состояние битов. |
with |
int with(); |
Возвращает текущее значение ширины. |
int with(int); |
Устанавливает ширину, равную параметру; возвращает предыдущее значение параметра. |
gcount |
int gcount(); |
Возвращает число символов, извлеченных из потока последним обращением. |
get |
int get(); |
Получает следующий символ либо EOF, сохраняя их в буфере. |
int get(signed char*, int, char='\n'); |
Извлекает из входного потока символы и помещает их в буфер, на начало которого указывает char*. Передача завершается, если число принятых символов на 1 меньше второго параметра или встретился символ '\n'. |
getline |
iostream& getline(signed char*, int, char='\n'); |
Извлекает из входного потока символы и помещает их в буфер, на начало которого указывает char*. Передача завершается, если число принятых символов на 1 меньше второго параметра или встретился символ '\n',который помещается в строку. |
ignore |
iostream& ignore(int n, int delim); |
Пропускает n символов в потоке. При обнаружении delim останавливается (по умолчанию, delim=EOF ). |
peek |
int peek(); |
Возвращает следующий символ без извлечения из потока. |
putback |
iostream& putback(char); |
Помещает символ обратно в поток. |
read |
read(signed char*, int); |
Извлекает из потока и помещает в символьный массив указанное число символов. |
seekg |
iostream& seekg(long); |
Перемещает заданное число байт относительно текущей позиции для потока ввода. Можно задавать направление. |
telig |
Long telig(); |
Возвращает текущую позицию курсора. В случае неуспешного выполнения возвращает отрицательное число. |
flush |
ostream& flush(); |
Флэширует внутренний буфер выходного потока. |
put |
ostream& put(char); |
Помещает заданный параметром char символ в выходной поток. |
seekp |
ostream& seekp (long); |
Устанавливает указатель записи выходного потока на абсолютную позицию, заданную параметром long. |
ostream& seekp (long, seek_dir); |
Перемещает указатель текущей позиции выходного потока на число байтов, заданное первым параметром. Второй параметр задает точку отсчета (0 – начало; 1 – текущая позиция; 2 – конец потока) |
tellp |
long tellp(); |
Возвращает текущую позицию выходного потока. |
write |
ostream& write (const signed, char *, int n); |
Помещает в выходной поток n символов из массива, на который указывает char *. Нуль-символы включаются в число переносимых символов. |
ostream& write (const signed, char *, int n); |