Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
30
Добавлен:
17.04.2013
Размер:
76.29 Кб
Скачать

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

Язык Си допускает не только последовательный доступ к элементам файлов, но и произвольный. Осуществить его помогают функции файлового указателя ftell( ) и

установки новой позиции указателя файла fseek( ) из заголовочного файла STDIO.H.

long int ftell(FILE *stream);

возвращает внутренний указатель файлового потока, равный смещению в байтах от начала двоичного файла до байта, с которого начинается следующая операция ввода/вывода. Это значение можно, например, передать функции fseek( ), чтобы передвинуть файловый указатель на несколько байтов вперед или назад. Можно использовать ftell( )и для текстовых файлов, но при этом возвращаемое значение не обязательно будет представлять байтовое смещение в файле.

FILE *stream - указатель на открытый файловый поток.

int fseek(FILE *stream, long offset, int whence); - перемещает внутренний указатель файлового потока, изменяя место в файле, с которого начинается следующая операция чтения или записи. В случае успеха функция возвращает 0, а в случае ошибки - ненулевое значение.

FILE *stream - указатель на открытый файловый поток; long offset - для двоичных файлов это - число байтов, на которое нужно поместить файловый указатель в направлении, указанном в whence. Для текстовых файлов это значение должно быть нулем или значением, возвращаемым функцией ftell( ). Чтобы переместить файловый указатель в обратном направлении (по направлению к началу файла),

следует установить offset равным отрицательному значению.

Int и hence указывает на начальное положение файлового указателя в файле:

Пример 3. Установить указатель файла на 12-ю позицию от начала текстового файла.

#include<stdio.h>

#include<stdlib.h>

void main()

{

FILE *inf;

char c;

//открыть текстовый файл в двоичном режиме.

inf=fopen(“FSEEK.CPP”,”rb”);

if( inf==NULL){

printf(“нельзя открыть fseek.cpp\n”);

exit(1);

}

//Ищем 12-й байт от начала файла

if(fseek(inf,11,SEEK_SET)!=0)

printf(“ошибка позиционирования файла\n”);

else {

fread(&c,1,1,inf);

printf(“12-й символ = %c”,c);

}

fclose(inf);

}

Мы встретили здесь еще одну незнакомую функцию fread(),

Описанную в заголовочном файле stdio.h, которая читает из потока данные, начиная с текущего файлового указателя. После чтения данных функцией fread() файловый указатель будет расположен непосредственно за последним прочитанным байтом.

Требования к отчету.

Отчет должен содержать:

  • наименование и цель работы;

  • краткие теоретические сведения;

  • формулировку задания своего варианта;

  • схему алгоритма

  • текст программы для варианта задания, соответствующего номеру фамилии студента в группе (если студент закреплен за определенной ЭВМ, имеющей номер, то номеру ЭВМ);

  • результаты выполнения программы.

Контрольные вопросы:

  1. Что такое поток?

  2. Что представляет собой файловый указатель?

  3. Перечислить режимы доступа к файлу.

  4. Как открыть и как закрыть файл?

  5. В чем заключаются особенности использования функций ftell() и fseek() для двоичных и для текстовых файлов?

Чтобы позиционировать файловый указатель до начала чтения, можно воспользоваться функцией fseek(). Fread() возвращает число прочитанных элементов. Если файловый указатель находится за концом файла, функция возвращает нуль.

Синтаксис функции:

site_t fread(void *ptr, size_t size, size_t n, FILE *stream);

void ptr – указатель на принимающий буфер, который должен иметь размер, достаточный для того, чтобы в нем разместились принимаемые данные.

size_t size – размер в байтах одного элемента, читаемого из файлового потока.

size_t n – количество читаемых элементов.

FILE *stream – указатель на файловый поток.

Соседние файлы в папке Lab4