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

Форматированный ввод-вывод бинарного файла

Следующий набор функций позволяет обмениваться данными с двоичными (бинарными) файлами, состоящими из записей фиксированной длины. Размер записи не ограничен, и от программиста зависит, каким его сделать. В качестве размера записи обычно берется размер массива или структуры данных.

Функция ввода:

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 при корректном выполнении.