Чтение/запись данных в файл.
Работа с файлами предполагает не только открытие и закрытие файлов, но и определенную обработку содержащейся в них информации. При этом нельзя обойтись без операций чтения и записи данных.
Рассмотрим функцию ввода/вывода для работы с файлами.
Функция gets( ) позволяет получить символ из потока. Прототип функции находится в заголовочном файле stdio.h.
Общий вид функции:
int gets(FILE *stream);
FILE *stream-любой файловый поток, открытый для чтения в текстовом режиме.
Если FILE *in;, то ch=gets( ) читает символ из входного потока и передвигает связанный с потоком указатель на следующий символ.
Функция puts( ) предназначена для записи символа ch в файл. Прототип функции- в заголовочном файле stdio.h. Функция выводит символ в файловый поток, например в файл, открытый функцией fopen( ).
int puts(int c,FILE *stream);
здесь:
int c - символ, записываемый в заданный поток;
FILE *stream - любой файловый поток, открытый для вывода.
В случае успеха возвращается c, иначе - EOF.
При работе с форматированными данными используются функции fprintf( ) и fscanf( ), описанные в заголовочном файле stdio.h.
int fprintf(FILE *stream,const char *format[,argument,...]);
записывает форматированный текстовый вывод в файловый поток, открытый для записи или присоединяемый в текстовом режиме. Возвращает количество записанных в поток байтов. Если были обнаружены ошибки, возвращает EOF.
int fscanf(FILE *stream,const char *format[,address,...];
читает текст из потока, преобразуя данные в двоичный вид в соответствии с описателями формата, содержащимися в строке формата format. Результирующие значения записываются в ячейки, заданные адресными аргументами.
FILE *stream - указатель на файловый поток;
const char *format - указатель на строку формата, которая должна содержать один или несколько описателей формата, каждому из которых предшествует символ %;
argument,... - список аргументов, соответствующих описанному формату;
address,... - список адресных указателей, по одному для каждого описателя формата.
Строковые функции при работе с файлами.
Для работы со строками применяются функции fgets( ) и fputs( ) из заголовочного файла stdio.h.
Char *fgets(char *s,int n,FILE *stream);
последовательно читает из файлового потока FILE *stream символы вплоть до следующего символа новой строки, включая его, или максимум n-1 символов. Прочитанные символы помещаются начиная с ячейки, адресуемой аргументом char *s. К концу строки присоединяется символ новой строки, если он прочитан, а также нулевой символ. В случае успеха возвращает char *s, а в случае ошибки - нуль.
char *s - указатель на буфер типа char, длинной по крайней мере n байтов.
int n - максимальное число символов, включая завершающий нулевой, которые должны быть прочитаны, начиная с ячейки, адресуемой аргументом s.
FILE *stream - любой открытый файловый поток, аналогичный возвращаемому функцией fopen( ), открытый для чтения в текстовом режиме.
int fputs(const char*s,FILE *stream);
записывает завершающуюся нулем строку символов в заданный поток. В случае успеха возвращает неотрицательное целое, а в случае ошибки - EOF.
const char*s - указатель на завершающуюся нулем строку, записываемую в выходной поток.
FILE *stream - указатель на файловый поток, аналогичный возвращаемому функцией fopen( ).
Рассмотрим примеры использования представленных функций.
Пример 1.Считать целое число из файла «sam» и записать его в конец файла «data».
#include <stdio.h>
void main( )
{
FILE *fi;
int age;
fi=fopen(«sam», «r»); //считывание
fscanf(fi, «%d»,& age); //fi указывает на «sam»
fclose(fi);
fi=fopen(«data», «a»); //дополнение
fprintf(fi, «sam is %d.\n», age); //fi указывает на «data»
fclose(fi);
}
Пример 2. Считывание файла строка за строкой.
#include <stdio.h>
#define MAXLIN 80
void main( )
{
FILE *f1;
char *string[MAXLIN];
f1=fopen(«story», «r»);
while(fgets(string, MAXLIN, f1)!=NULL)
puts(string);
}
Мы разместим вводимую информацию в символьный массив string.
Функция fgets( ) возвращает значение NULL, если встречает символ EOF. Это позволяет проверить, достигнут ли конец файла.