Процедурное программирование на языке С. Часть 3. Файлы и структуры: Методические указания к лабораторным работам по курсам «Алгоритмические языки и программирование» и «Процедурное программирование», страница 11

SEEK_END   ↔   2   ↔   точка отсчета –  конец файла.

Функция fseek() возвращает значение 0, если указатель успешно  перемещен. В случае ошибки  возвращается некоторое  ненулевое  значение.

Следует заметить, что функцию fseek() рекомендуется использовать только при работе с двоичными файлами.  Для потоков, открытых в  текстовом  (преобразующем)  режиме, применение fseek()  является ограниченным, т.к. комбинации комбинации «возврат каретки» (ASCII 13) и «конец строки» (ASCII 10) могут стать причиной выработки непредвиденного  результата.

Правильная работа функции fseek() с текстовыми файлами гарантируется только в случае, когда параметр origin  имеет значение SEEK_SET, а значение параметра offset получено либо в результате предшествующего вызова функции ftell()  для  данного файла, либо является нулем и соответствует ситуации, когда активной (текущей) позицией становится начало файла.

В примере 7.5 демонстрируется использование функции fseek() с текстовым файлом  file-pos.txt, в котором    записаны целые 2-значные числа, не разделенные пробелами; перед числами, меньшими 10, записан 0:

0102030405060708091011121314151617181920

В программе  с клавиатуры вводится значение переменной n, которое соответствует количеству чисел в файле, и значение переменной L , причем          L  < n  –  4.  Из файла file-pos.txt  считываются первые L чисел, вычисляется их сумма. Следующие два числа пропускаются, считываются оставшиеся числа и рассчитывается их сумма. Полученные суммы  записываются  в файл file-pos.out.

Пример 7.5.

# include <stdio.h>

#include <string.h>

#include <stdlib.h>

void main (void)

{ FILE *try1, *tr;     long sm;    char *s, str[3]; 

   int i,m,n,L,  sum_l=0, sum_n=0, *hs;

   printf("\n Vvod kolihestva elements n = ");    scanf("%d",&n); fflush(stdin);

   printf("\nVvod L < n:  L = ");       scanf("%d",&L);

s=(char *) malloc(n*2*sizeof(char));  /*Числа из файла будут считываться посимвольно и записываться в участок памяти, адресуемый указателем s */

hs=(int *) malloc(n*sizeof(int));   /*В участок памяти, адресуемый указателем hs,  будут записаны числа после преобразования соответствующих символов*/

tr = fopen("file-pos.out","w+");       /* Файл  file-pos.out открывается для записи*/

try1 = fopen("file-pos.txt","r");          /* Файл  file-pos.txt открывается для чтения*/

   if (try1 == NULL)   { printf("ERROR:  can't open file-pos.txt\n"); exit(0);   }

m=fread(s,1,L*2,try1);   /* Из файла, связанного с указателем try1, т.е. из файла  file-pos.txt, последовательно  считывается L*2 символов в участок памяти, адресуемый указателем s, количество успешно прочитанных символов – значение переменной m */

printf("m=%d\n",m);

 if (m<L*2)

                { printf("ERROR durring reading  file-pos.txt\n");   exit(0);    }

    for (i=0; i<m; i+=2)

        {   printf ("s(%d)=%c%c\n",(int)(i/2)+1,*(s+i),*(s+i+1)); 

           *str=*(s+i);    *(str+1)=*(s+i+1);       *(str+2)='\0'; 

            hs[(int)(i/2)]=atoi(str);

           sum_l+=hs[(int)(i/2)];

        }        /* На i-ой итерации цикла i-ый элемент целочисленного массива образуется следующим образом: очередная пара символов записывается, завершаясь нулевым символом,  в вспомогательный участок памяти (с адресом str ); очередное 2-значное число из  файла  file-pos.txt получается как возвращаемое значение функции atoi()  с аргументом – адресом вспомогательного  участка  памяти */

    printf("\nRESULT: summ of first %d elements  sum_l = %d\n\n",L,sum_l);

sm=ftell(try1);        printf("sm=%ld\n",sm);     /* Определение смещения относительно начала файла file-pos.txt   и вывод его значения на экран*/