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