- •Институт математики, экономики и механики кафедра математического обеспечения компьютерных систем в. С. Макогон, и. Н. Лисицына
- •Оглавление
- •Введение
- •Основныетипы данных, операции и выражения
- •Описание переменных.
- •Операции , выражения и операторы.
- •3. Операторы управления программой. Базовые управляющие структуры.
- •Операторы ветвления Условный оператор if
- •Оператор - переключатель
- •Операторы повторения (цикла).
- •4. Программирование алгоритмов линейной структуры.
- •5. Программирование разветвляющихся алгоритмов (оператор if).
- •6. Программирование разветвляющихся алгоритмов (оператор switch)
- •Оператор for
- •Цикл с постусловием do -while
- •8. Итерационные циклы
- •Задачи для самостоятельного решения
- •9. Программирование алгоритмов с использованием функций
- •Основные понятия численного решения уравнений
- •10. Программирование алгоритмов с использованием массивов
- •11. Символьные переменные и строки. Обработка строк.
- •Другие средства ввода-вывода символов и строк
- •Массивы строк
- •12. Указатели
- •Массивы указателей
- •2. Описание метода трапеций
- •3. Программный комплекс
- •13. Структуры
- •Указатели на структуры
- •14. Файлы. Потоковый ввод-вывод
- •Функции для работы с файлами
- •Открытие файловых потоков
- •Закрытие файловых потоков
- •Удаление файлов
- •Переименование файлов
- •Реинициализация
- •Функции для ввода-вывода по символам
- •1 Вариант) содержит только буквы исходной строки
- •2 Вариант) перевернута по отношению к исходной
- •Двоичные (бинарные) файлы. Блочно-ориентированный ввод-вывод.
14. Файлы. Потоковый ввод-вывод
Файл–физический объект, который содержит данные. Работа с файлами в С++ реализуется либо средствами методов ООП, либо с помощью функций, унаследованных от стандартной библиотеки С для работы с потоками. Каждый способ имеет свои преимущества. В программах, не использующих механизм классов и объектов, удобнее использовать потоковый ввод-вывод в стиле языка С.
В С/С++ все файлы рассматриваются как неструктурированный поток (последовательность) байтов (т.е. никакой логической структуры не предполагается). Физически поток представляет файл или устройство (клавиатура, дисплей, принтер), снабженный средствами буферизации.
Буферизация.
Потоковый ввод-вывод позволяет обрабатывать данные различных размеров и форматов, обеспечивая при этом буферизированный ввод и вывод. Таким образом, поток – это файл снабженный средствами буферизации. Буферы операционной системы реализуются в виде участков основной памяти фиксированного размера (чаще всего 512 и 1024 байта), который определен как константа стандартной библиотеки BUFSIZ. Буферизация используется для уменьшения числа операций с магнитным диском.
При чтении данных из файла в буфер поступает блок данных, равный размеру буфера (независимо от количества затребованной программой информации). Затем эти данные побайтно или определенными порциями передаются программе пользователя, а обращение к диску уже не происходит. Лишь когда буфер будет опустошен, произойдет чтение с диска нового блока данных.
При выводе данных в файл они накапливаются в буфере, а при заполнении буфера записываются в виде единого блока на диск, за одно обращение к диску. Благодаря использованию системы буферизации уменьшается влияние механической составляющей на скорость обработки данных.
Стандартная библиотека
Для работы с файлами в языке С необходимо использовать заголовочный файл стандартной библиотеки, который содержит определения макросов, константы и переменные, объявления функций и типов. Называется он <stdio.h>.
Функции, объявленные в <stdio.h>, являются весьма популярными благодаря тому, что являясь частью Стандартной библиотеки языка С, они гарантируют работу на любой платформе, поддерживающей С.
В заголовочном файле <stdio.h> определен весьма важный тип данных – структура FILE.
/* Definition of the control structure for streams
*/
typedef struct {
short level; /* fill/empty level of buffer */
unsigned flags; /* File status flags */
char fd; /* File descriptor */
unsigned char hold; /* Ungetc char if no buffer */
short bsize; /* Buffer size */
unsigned char _FAR *buffer; /* Data transfer buffer */
unsigned char _FAR *curp; /* Current active pointer */
unsigned istemp; /* Temporary file indicator */
short token; /* Used for validity checking */
} FILE; /* This is the FILE object */
Эта структура описывает сущность, с которой ассоциируется любой поток, используемый для ввода-вывода. Она содержит дескриптор файла, указатель текущей позиции в файле, индикатор конца файла, индикатор ошибок, указатель на буфер потока и его размер. Прежде чем начать работать с потоком, его следует открыть. Когда поток открывается для ввода-вывода, он связывается со структурой FILE.
Замечание. Указатель текущей позиции в файле (текущий указатель файла) определяет то место в файле, откуда начинается чтение или запись потока.
Существует несколько предопределенных указателей на потоки, которые автоматически инициализируются при запуске программы. Это:
stdin– указатель наFILE, указывающий на стандартный поток ввода (обычно клавиатура)
stdout– указатель наFILE, указывающий на стандартный поток вывода (обычно дисплей терминала)
stderr– указатель наFILE, указывающий на стандартный поток ошибок (обычно дисплей терминала)
Также определены еще два специализированных потока, это stdprnиstdaux, для работы с принтером и стандартным последовательным портом. Эти потоки употребляются реже.
Константы
В заголовочном файле <stdio.h> определен ряд констант, некоторые из них представлены ниже.
#define NULL 0
макрос, расширяющий константу нулевого указателя; то есть, константу, представляющую значение указателя, гарантированно указывающего несуществующий адрес объекта в памяти.
#define EOF (-1) /* End of file indicator */
отрицательное целое число типа int, используемое для обозначения конца файла.
#define BUFSIZ 512 /* Buffer size for stdio */
целое число, равное размеру буфера, используемое функцией setbuf()
#define SEEK_CUR 1
#define SEEK_END 2
#define SEEK_SET 0
целые числа, которые могут быть переданы функции fseek() для запроса позиционирования относительно текущей позиции в файле либо конца или начала файла соответственно.