Прямой доступ к файлам

Форматированный ввод-вывод

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

1. int fprintf(FILE *f, const char*fmt,. . .),

где FILE*f – указатель на файл, в который производится запись,

const char*fmt – форматная строка,

. . . – список переменных, которые записываются в файл.

Функция возвращает число записанных символов.

 

2. int fscanf(FILE *f, const char*fmt, par1,par2, . . .),

где FILE*f – указатель на файл, из которого производится чтение,

const char*fmt – форматная строка,

par1, par2, … – список переменных, в которые заносится информация из файла.

Функция возвращает число переменных, которым присвоено значение.

 

Пример 113

void main()

{

FILE *f;

int n;

if((f=fopen(“int.dat”,”w”))==0)

{

perror(“int.dat”);

exit(0);

}

for(n=1;n<11;n++)

fprinf(f,”\n%d %d”,n,n*n);

fclose(f);

if((f=fopen(“int.dat”,”r”))==0)

{

perror(“int.dat”);

exit(1);

}

int nn;

while(fscanf(f, ”%d%d”,&n,&nn))

printf(“\n%d %d”,n,nn);

fclose(f);

}

Рассмотренные ранее средства обмена с файлами позволяют записывать и считывать данные только последовательно. Операции чтения/записи всегда производятся, начиная с текущей позиции в потоке. Начальная позиция устанавливается при открытии потока и может соответствовать начальному или конечному байту потока в зависимости от режима открытия файла. При открытии потока в режимах “r” и “w” указатель текущей позиции устанавливается на начальный байт потока, при открытии в режиме “a” – за последним байтом в конец файла. При выполнении каждой операции указатель перемещается на новую текущую позицию в соответствии с числом записанных/прочитанных байтов.

Средства прямого доступа дают возможность перемещать указатель текущей позиции в потоке на нужный байт. Для этого используется функция

int fseek(FILE *f, long off, int org),

где FILE *f – указатель на файл,

long off – позиция смещения

int org – начало отсчета.

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

SEEK_SET ==0 – начало файла;

SEEK_CUR==1 – текущая позиция;

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

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

 

Пример 114

fseek(f,0L,SEEK_SET); /*перемещение к началу потока из текущей позиции*/

fseek(f,0L,SEEK_END); /*перемещение к концу потока из текущей позиции*/

fseek(f,-(long)sizeof(a),SEEK_SET); //перемещение назад на длину переменной а.

 

Кроме этой функции, для прямого доступа к файлу используются:

long tell(FILE *f); /*получает значение указателя текущей позиции в потоке*/

void rewind(FILE *f); /*установить значение указателя на начало потока.*/