Опубликован: 02.02.2011 | Уровень: для всех | Доступ: свободно
Лекция 24:

Решение задач на обработку файлов

< Лекция 23 || Лекция 24: 123 || Лекция 25 >
Аннотация: В лекции рассматриваются функции библиотеки классов потокового ввода-вывода, примеры реализации алгоритмов решения задач на обработку файлов.

Цель лекции: изучить использование алгоритмов обработки элементов файла в решении задач и научится приемам решения задач на обработку элементов файла на языке 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, имеющей прототип

long setf(long flags);

Например, чтобы установить флаг 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);
< Лекция 23 || Лекция 24: 123 || Лекция 25 >
Денис Курбатов
Денис Курбатов
Владислав Нагорный
Владислав Нагорный

Подскажите, пожалуйста, планируете ли вы возобновление программ высшего образования? Если да, есть ли какие-то примерные сроки?

Спасибо!