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

В примере 7.1  функция fopen() используется для открытия файлов name.txt и name1.txt.

Пример 7.1.

# include <stdio.h>

voidmain()

{ FILE * fp  ;  FILE * fg

   fp fopen(“name.txt”, “r”);

   fd =  fopen(“C://EXAMPLES//name1.txt”, “w”);  

   …

fclose(fp);  fclose(fd);       

}

После выполнения оператора присваивания  fp= fopen(“name.txt”,“r”);    в участок памяти, на который указывает fp, заносятся все необходимые данные об открытом только для чтения файле name.txt, который находится в текущей папке. Таким образом,  указатель fpинициализируется, т.е. настраивается на файл name.txt.  Идентификатор fd  указывает на информацию о файле name1.txt, который создается в папке EXAMPLESна диске С.

Функция fclose(fd) является обратной по отношению к  fopen(); она разрывает связь между указателем на поток и внешним именем, установленную функцией fopen(), тем самым объявленный указатель на поток можно связывать с другим файлом,  вызвав функцию fopen() с другими аргументами.  В операционной системе имеются  ограничения на число одновременно открытых  файлов,  которыми  может распоряжаться  программа.  

7.2. ФУНКЦИИ ЧТЕНИЯ/ЗАПИСИ ДАННЫХ ИЗ/В  ФАЙЛЫ

В отличие от консольных функций функции ввода/вывода информации из/в дисковые файлы работают не со стандартными потоками stdin, stdout, а с потоками, связанными с дисковыми файлами функциями fopen() и freopen(), поэтому имеют дополнительный параметр – указатель на конкретный поток. Кроме того, имена соответствующих функций отличаются наличием символа ‘f’ в именах функций, предназначенных для обработки файлов.  Рассмотрим лишь некоторые из этих функций, отметив их принципиальные отличия.

В примере 7.2 представлена программа, обрабатывающая файл infi.txt (файл хранится в текущей папке). Файл начинается со слова и состоит из слов и целых чисел, причем каждое  число следует за очередным словом после пробела. На экран выводится сумма всех чисел файла. Предполагается, что препроцессорная константа N задает количество слов (и соответственно чисел) в файле.

Пример7.2.

#include <stdio.h>

#define N 6

void main (void)

{ int m =0, i, t[N] ; char s[N][5]; 

   FILE * tr;     tr = fopen("infi.txt","r");

for (i=0; i<N; i++)

       {  fscanf(tr, "%s  %d", s[i], &t[i]); /* При каждом вызове функция fscanf() записывает очередное слово по адресу s[i], а очередное целое число из файла – значение i-го элемента целочисленного массива с именем  t * /

m+ = t[i];  }

printf(" sum = %d", m); 

   fclose(tr);

}

Обобщение функции gets() – функция fgets() с заголовком

char * fgets (char *string, int n, FILE * stream).  Принципиальным отличием этих двух функций является возможность функции fgets() считывать не всю строку, а только n–1 символ очередной строки (т.е. той строки, на начале которой в текущий момент находится индикатор позиции в файле).

Функция fgets()  читает строку из входного потока stream и располагает ее по адресу – значению параметра  string. Символы считываются, начиная с текущей позиции stream. Количество считываемых символов определяется по следующим правилам.

1. Если количество символов в очередной строке больше n–1, то каждый из первых n –1 символов очередной строки записывается, начиная с  адреса string, после последнего символа записывается символ окончания строки '\0'. К моменту следующего вызова функции fgets() для работы с тем же потоком индикатор позиции находится на n –ом символе данной строки.

2. Если количество символов в очередной строке равно или меньше n–1, то вся очередная строка записывается, начиная с  адреса string, после последнего символа записывается символ окончания строки '\0'. К моменту следующего вызова функции fgets() для работы с тем же потоком индикатор позиции находится в начале следующей строки файла. Если в начале считывания n равнялось 1, то строка, записанная по адресу string будет пустой (""). Функция fgets() аналогична библиотечной функции gets(), однако, функция fgets() записывает в выделенный участок памяти и символ новой строки (код этого символ – 32).