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 и вывод его значения на экран*/
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.