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

Функции позиционирования

Когда файл открывается для записи или чтения, с ним связывается структура FILE, определенная в заголовочном файле <stdio.h>. Эта структура связывает с каждым открытым файлом счетчик положения текущей записи. Сразу после открытия файла его значение равно 0. Каждая операция вызывает приращение значения этого счетчика на число записанных ила прочитанных из файла бантов. Функции позиционирования - fseek (), ftell () и rewind () позволяют изменять или получать значение счетчика, связанного с файлом.

Функция ftell () возвращает текущее значение счетчика, связанного с файлом. Она имеет следующий прототип:

long int ftell(FILE *stream);

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

int fseefc(FILE *stream, long offset, int from);

Эта функция изменяет позиционирование файлового потока stream (изменяя значение указанного счетчика) на offset относительно позиции, определяемой параметром from. Дня потоков в текстовом режиме параметр offset должен быть равен 0 или значению, возвращаемому функцией ftell (). Параметр from может принимать следующие значения:

SEEK_SET (=0) начало файла;

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

SEEK_END (=2) конец файла.

Функция возвращает 0, если указатель текущей позиции в файле успешно изменен, и отличное от нуля значение в противном случае.

Функция rewind () имеет следующий прототип:

void rewind(FILE *stream);

Она устанавливает файловый указатель позиции в начало потока. Рассмотрим пример, демонстрирующий работу этих функций:

#include <stdio.h>

#include <string.h>

struct Client

{

int Num;

char SurName[27]; char Name[21]; char SecName[21];

};

int main(void)

{

FILE *stream; Client AClient, RClient; long int pos;

//Открываем файл для вывода if ((stream = fopen("SAMPLE.DAT", "wb")) = NULL)

{

printf("Cannot open output file.\n");

return 1;

}

AClient.Num = 1;

strcpy(AClient.SurName,"Petrov"); strcpy(AClient.Name, "Petr");

strcpy(AClient.SecName, "Petrovich"); //Запись структуры в файл fwrite

(tAClient, sizeof (AClient), 1, stream);

pos = ftell(stream);

//Выводим позицию файла и длину структуры printf("The file pos = %d " "structure length = %d\n", pos, sizeof(AClient)};

//Репоаиционируем файл rewind(stream);

//Опфиваем файл для чтения if ((stream = fopen("SAMPLE.DAT", "rb")) == NULL)

{

printf("Cannot open input file.\n");

return 2;

}

fread (&RClient, sizeof (RClient), 1, stream);

//Закрываем файл fclose(stream);

printf("The structure contains:\n"); printf("Num = %d SurKame = %s Name = %s " "SecName = %s",

RClient.Num, RClient.SurName, RClient. Name, RClient. SecName) ;

return 0; }

Этот пример представляет собой модификацию предыдущего примера. Здесь файл открывается лишь однажды, и после записи в него структуры на экран выводится значение указателя позиции и длины структуры. При выполнении программа выводит па экран:

The file pos = 73 structure length = 73 The stiructura contains: Num = 1 SurName = Petrov Name = Petr > SecName = Petrovich

В заключение заметим, что библиотека стандартных функций ввода-вывода содержит много других, не рассмотренных здесь функций.

Соседние файлы в папке ЯзыкС++Глушаков