- •Лабораторная работа n 7 Обработка текстовых и бинарных файлов
- •Понятие файла
- •Доступ к файлу
- •Посимвольный ввод
- •Форматированный ввод-вывод текстового файла
- •Форматированный вывод (запись в файл)
- •Форматированный ввод (чтение файла)
- •Построчный ввод-вывод
- •Форматированный ввод-вывод бинарного файла
- •Позиционирование в файле
Форматированный ввод-вывод бинарного файла
Следующий набор функций позволяет обмениваться данными с двоичными (бинарными) файлами, состоящими из записей фиксированной длины. Размер записи не ограничен, и от программиста зависит, каким его сделать. В качестве размера записи обычно берется размер массива или структуры данных.
Функция ввода:
fread(pointer, size, no_records, fp)
считывает из заданного файла записи фиксированной длины, число байтов в которых равно значению size. Количество считываемых записей определяется целым значением no_records. Данные считываются из файла, соответствующего указателю fp, в область памяти с адресом, указанным в аргументе pointer. Например, следующий фрагмент.
#include <stdio.h>
main()
{
struct STOCK_INFO
{
char co_name[15];
char date[9];
int qnty;
float price;
char comment[40];
} stock_rec;
FILE *fp;
int n;
fp = fopen("stock.dat","r");
n = fread(&stock_rec, sizeof(stock_rec), 1, fp);
. . .
}
считает одну запись (sizeof(stock_rec) байтов) в структуру stock_rec. Если аргумент 1 изменить на 2 , то в память будут считаны две записи (тогда потребуется изменить определение структуры на массив структур).
Функция fread возвращает либо число считанных записей, либо значение EOF. В ситуации, когда затребовано чтение трех записей, а в файле осталось только две, функция fread считает эти две записи и возвращаемое ею значение будет равно 2.
Функция вывода
fwrite(pointer, size, no_records, fp)
записывает в файл несколько записей, число которых определяется значением no_records. Записываемые данные берутся из области памяти с адресом, равным значению указателя pointer. Длина каждой записи (в байтах) равна значению size. Этот аргумент часто кодируется как sizeof(*pointer). При успешном вызове функция fwrite возвращает значение, равное числу переданных файлу записей. При ошибке записи она возвращает нуль.
Таким образом, функции ввода-вывода записей наиболее удобныдля чтения-записи данных, представляющих собойструктуру или массив.
Позиционирование в файле
Для произвольного доступа к данным, хранящимся в файле, необходима функция, способная перемещать указатель чтения/записи внутри этого файла. Этим требованиям удовлетворяет функция fseek.
intfseek(FILE*fp,longoffset,intwhence)
fp– указатель открытого файла,offset– количество байтов на которое нужно сместить указатель чтения/записи,whence– одно из значений (SEEK_SET,SEEK_CUR,SEEK_END) определяющих позицию, относительно которой происходит смещение указателя чтения/записи.
SEEK_SET– смещение от начала файла
SEEK_CUR– смещение от текущей позиции
SEEK_END– смещение от конца файла.
Узнать текущую позицию относительно начала файла можно с помощью функции ftell()с прототипом
long ftell(FILE *f);
Функция ftell()возвращает текущую позицию (неотрицательное значение) в случае успеха или отрицательное значение-1при неудаче (например, если файл не разрешает прямое позиционирование).
Кратко о других функциях позиционирования:
rewind(FILE*stream) – устанавливает указатель на начало файла.
intfsetpos(FILE*stream,constlong*pos) – устанавливает значение указателя файла в позицию, заданную значением по указателюpos. Возвращает 0 при корректном выполнении.
intfgetpos(FILE*stream,constlong*pos) – помещает в переменную на которую указывает pos, значение указателя на текущую позицию в файле. Возвращает 0 при корректном выполнении. Возвращает 0 при корректном выполнении.