Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЗФ_ОАиП / Курс Лекций ОАиП.doc
Скачиваний:
65
Добавлен:
21.03.2016
Размер:
5.89 Mб
Скачать

8.4.2.1 Функции получения текущего положения указателя потока ftell и fgetpos

Прототип функции ftell (из <stdio.h>):

long int ftell(File *f);

Функция ftell возвращает текущую позицию в файле, связанном с потоком f, как длинное целое. В случае ошибки возвращает число (-1).

Прототип функции fgetpos (из <stdio.h>):

long int fgetpos (File *f, fpos_t *pos);

Функция fgetpos возвращает текущую позицию в файле, связанном с потоком f, и копирует значение текущей позиции по адресу pos. Это значение позднее может использоваться функцией fsetpos. Возвращаемое значение имеет тип fpos_t, который используется функциями fgetpos и fsetpos для хранения текущей позиции файла:

typedef long fpos_t;

8.4.2.2 Функции задания положения указателя fseek и fsetpos, rewind

Прототип функции fseek :

int fseek (File *f, long off, int org);

Функция перемещает текущую позицию в файле, связанном с потоком f, на позицию off, отсчитываемую от значения org, которое должно быть равно одной из констант, определенных в <stdio.h>:

SEEK_CUR – от текущей позиции указателя (1);

SEEK_END – от конца файла (2);

SEEK_SET - от начала файла (0).

Параметр off задает количество байтов, на которое необходимо сместить указатель соответственно параметру org. Величина смещения может быть как положительной, так и отрицательной, но нельзя сместиться за пределы начала файла.

Такой доступ к данным в файле называется произвольным.

Прототип функции fsetpos :

int fsetpos (File *f, const fpos_t *pos);

Функция перемещает текущую позицию в файле, связанном с потоком f, на позицию *pos, предварительно полученную с помощью функции fgetpos.

Примечание. Функции fseek и fsetpos нельзя использовать для стандартных потоков.

Функция rewind очищает флаги ошибок при работе с потоками и устанавливает указатель на начало файла. Ее прототип:

void rewind( File *f );

8.4.3 Функции чтения и записи потока байтов fread и fwrite

Прототип функции fread:

size_t fread (void *buffer, size_t size, size_t count, FILE *stream);

Функция fread считывает count элементов длиной size байтов в область, заданную указателем buffer, из потока stream. Возвращает количество прочитанных элементов, которое может быть меньше count, если при чтении произошла ошибка или встретился конец файла.

Прототип функции fwrite:

size_t fwrite (const void *p, size_t size, size_t n, FILE *f);

Функция записывает n элементов длиной size байтов из буфера, заданного указателем p, в поток f. Возвращает число записанных элементов.

Примеры.

1. Записать в бинарный файл целочисленный массив из n элементов.

Пусть описан массив А следующим образом:

int A[100];

Запишем в бинарный файл f первые n элементов этого массива:

fwrite (A, sizeoff(int), n, f);

Файл f может иметь описание:

FILE*f=fopen(“b1.dat”, “wb”);

2. Записать в бинарный файл массив записей.

struct train

{ int ntrain;

char s[50];

char v1[5];

char v2[5];

}t[20];

FILE*f=fopen(“b2.dat”, “wb”);

fwrite (t, sizeoff(struct train), n, f);

3.Прочитать из бинарного файла третий элент массива t.

fseek (f, 2* sizeoff(struct train), 0);

struct train g;

fread (g, sizeoff(struct train), 1, f);

printf(“Номер третьего поезда:%d\n”, g.ntrain);