конспект лекций, вопросы к экзамену

Средства позиционирования в потоке (с примером)

В библиотеку Си имеется функция 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 *) – установить указатель текущей позиции в потоке на начало потока.

02.08.2017; 20:00
просмотров: 140