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

3. Функция fgets()  возвращает указатель на строку string. В слу­чае ошибки или конца файла возвращается значение NULL. Для опре­деления того, что произошло – ошибка или конец файла – используют­ся функции feof()  и  ferror().

В примере 7.3 представлена функция, подсчитывающая с помощью функции fgets() количество строк в файле.

Пример7.3.

unsigned FileSize(FILE *fp)   

{  unsigned n=0;    char B[256];

   while (!feof(fp))  { if(fgets(B,255,fp)!=NULL)   n=n+1; };   

return (n);

}

Помимо функций  – обобщенных вариантов консольных функций – для чтения/записи в дисковые файлы существуют еще две функции: fread() и fwrite().

Функция с заголовком int fread(char * buffer, int size, int count, FILE * stream) считывает объекты (общее количество объектов – count,  размер в байтах каждого объекта –  size) из  потока stream и записывает эти объекты, начиная с адреса – значения переменной buffer. Функция fread() возвращает число действительно прочитанных объектов. Если при чтении возникла ошибка или встретился конец файла, возвращаемое число меньше, чем значение параметра count.

Функция с заголовком int fwrite(char * buffer, int size, int count, FILE * stream) записывает объекты (общее количество объектов – count,  размер в байтах каждого объекта –  size) в поток stream. Объекты расположены начиная с адреса – значения переменной buffer. В случае ошибки, т.е. если число полностью записанных объектов меньше, чем count,  функция  возвращает это число.

В примере 7.4 100 двоичных длин­ных целых из файла с именем data  записывается по адресу list .

Пример7.4.

#include <stdio.h>

 void main (void)

   {FILE *stream; long list[100]; int numread;

     stream = fopen("data", "r+b");

     numread = fread((char *)list, sizeof(long), 100, stream);

   }

7.3. СРЕДСТВА ПОЗИЦИОНИРОВАНИЯ ФАЙЛОВ

Функции, рассмотренные в разделе 7.2, позволяют только последовательно считывать/записывать информацию. Средства позиционирования файлов позволяют работать с файлами на диске как с обычным символьным массивом, осуществляя доступ к нужному байту файла.

Функция с заголовком long int ftell (FILE *stream) позволяет определить номер активной позиции, т.е. той позиции с которой начнется работа очередной вызываемой функции. Строго говоря, функция возвращает значение индикатора текущей позиции в файле, на который указывает stream, как смещение (значение типа long int) относительно начала файла. В случае двоичных потоков это значение равно количеству байт, который отделяют указатель от начала файла. Для текстовых потоков возвращаемое значение может не иметь определенной интерпретации. Это связано с возможными преобразованиями символов,  влияющими на размер файла. Например, комбинация кодов возврата каретки (ASCII 13) и конца строки (ASCII 10) заменяются разделителем строк.

В случае ошибки функция ftell ()  возвращает значение -1L.

При работе с файлом, т.е. в процессе записи/чтения, часто возникает необходимость перейти к определенной позиции файла. Соответствующее перемещение указателя в любое место файла позволяет осуществить функция fseek() с заголовком

int fseek(FILE * stream, long offset, int origin). Функция  fseek() устанавливает указатель текущей позиции файла, связанного с потоком stream, в соответствии со значениями параметров origin  и offset. При этом параметр origin  задает точку отсчета (начала смещения) в потоке, а параметр offset – количество байт, на которые будет смещен внутренний указатель файла относительно этой точки отсчета.

В качестве значения параметра  origin можно использовать один из трех макросов, определенных в заголовке <stdio.h>: SEEK_SET, SEEK_CUR, SEEK_END,  – в зависимости от выбора точки отсчета  в потоке.  Справедливы следующие соответствия:

SEEK_SET    ↔   0   ↔   точка отсчета – начало файла;

SEEK_CUR   ↔   1   ↔   точка отсчета –  текущая позиция в файле;