В библиотеку Си имеется функция fseek() для установки указателя текущей позиции на нужный байт файла потока. Эта функции имеет следующий прототип:
int fseek( указатель_на_поток, смещение, начало_отчета );
где:
- смещение – величина, задающее количество байтов, на которое должен сместиться указатель от начала отсчета. Задается переменной или выражением типа long (может иметь отрицательное значение).
- начало_отчета – задается одной из предопределенных констант, размещенных в заголовочном файле stdio.h :
SEEK_SET – (имеет значение 0) –начало файла;
SEEK_CUR - (имеет значение 1) – текущая позиция;
SEEK_END - (имеет значение 2) –конец файла.
Функция fseek() возвращает 0, если перемещение в потоке (файле) выполнено успешно, в противном случае возвращается ненулевое значение.
Приведем примеры использования функции fseek():
- перемещение к концу потока fp (файла) из произвольной позиции:
fseek(fp, 0L, SEEK_END); - перемещение к началу потока fp (файла) из произвольной позиции:
fseek(fp, 0L, SEEK_SET); - перемещение к пятой записи потока fp (файла) из произвольной позиции:
long k;
k = 5*sizeof(zap);
fseek(fp, k, SEEK_SET);
где zap – структура, описывающая тип записей файла.
Ну и программа, которая нужна....или не нужна...я не знаю, но пусть будет.
# include <stdio.h>
# include <conio.h>
# include <string.h>
# include <stdlib.h>
struct zap
{
int God;
int Mes;
float doh,rash, prib;
};
void main ()
{
int God, Mes, Kz, i;
long N;
zap inf;
FILE * F;
int pr;
clrscr();
F = fopen ("Е:\\ EFFECT\\ prib.doc ", "rb");
if (F == NULL)
{ perror (“Ошибка при открытии файла Е:\\ EFFECT\\ prib.doc ”);
getch();
exit(0);
}
do
{
printf (“God =”);
scanf (“%d”, &God);
printf (“Mes =”);
scanf (“%d”, & Mes);
printf (“Kz =”);
scanf (“%d”, & Kz);
N = 12*( God -2000) + Mes – 1;
pr = fseek ( F, N, SEEK_SET);
if (pr == 0)
for (i = 0; i <Kz; i++)
{
fread ( &inf, 1, sizeof(zap), F);
printf (“ %d %d %7.2f %7.2f %7.2f \n”,
inf.God, inf.Mes, inf. doh, inf. rash, inf. prib);
}
else
{
printf (“Запись не найдена! Повторите ввод!”);
getch();
}
} while (pr != 0);
getch();
fclose(F);
}
Кроме рассмотренной функции fseek() в библиотеке функций языка Си находятся следующие функции для работы с указателями текущей позиции в потоке:
long ftell (FILE *) – получить значение указателя текущей позиции в потоке;
void rewind (FILE *) – установить указатель текущей позиции в потоке на начало потока.