Простейший способ выполнить чтение из файла или запись в файл – использовать функции fgetc() или fputc().
Функция getc() выбирает из файла очередной символ; ей нужно только знать указатель на файл, например,
char Symb=fgetc(fin);
Если при обработке достигается конец файла, то функция getc() возвращает значение EOF(end of file).
Функция putc() заносит значение символа Symb в файл, на который указывает out. Формат вызова функции:
f putc(Symb,out);
Пример 1. Текст из файла my_char.txtвыводится на экран. Если файл не найден, на экран выводится сообщение "File not found!":
#include "stdafx.h"
int main()
{
FILE *ptr; //описание указателя на файл
unsigned char ch;
if ((ptr=fopen("my_char.txt","r"))!=NULL)//открытие файла для чтения
{
ch=fgetc(ptr); //чтение первого символа из файла
while (!feof(ptr)) //цикл до конца файла
{
printf("%c",ch); //вывод символа, взятого из файла
ch=fgetc(ptr); //чтение следующего символа из файла
}
fclose(ptr); //закрытие файла
}
else printf("\nFile not found!");
return 0;
}
В этом примере для чтения файла используется указатель ptr. При открытии файла производится проверка. Если переменной ptr присвоено значение NULL, то файл не найден; на экран выводится соответствующее сообщение, и программа завершается. Если ptr получил ненулевое значение, то файл открыт. Далее выполняется чтение символов из файла до тех пор, пока не будет достигнут конец файла (!feof(ptr)). Прочитанный символ помещается в переменную ch, а затем выводится на экран.
|
|
Пример 2. Записать в файл буквы, вводимые с клавиатуры. Ввод продолжается до нажатия клавиши F6 или CTRL/z (ввод символа EOF – конца файла):
#include "stdafx.h"
int main(void)
{
char c;
FILE *out; // описание указателя на файл
out=fopen("Liter.txt","w"); //открытие файла для записи
while ((c=getchar())!=EOF) /*пока не будет введен символ конца
fputc(c,out); // запись введенного символа в файл
fclose(out); //закрытие файла
return 0;
}
Функции fscanf() и fprintf() выполняют форматированный ввод/вывод.
Чтение из файла выполняет функция fscanf():
fscanf(fin,[ " строка формата " ],[список адресов переменных]);
Функция возвращает количество введенных из файла значений или EOF.
Запись в файл осуществляет функция fprintf():
fprintf(out,[ " строка формата " ],[список переменных, констант]);
Возвращает количество выведенных в файл байт (символов) или EOF.
Строка формата функций fscanf() и fprintf() формируется так же, как было описано ранее в главе, посвященной консольному вводу/выводу и функциям printf() и scanf().
Следует заметить, что вызов функции
fscanf(stdin,[строка формата],[список адресов переменных]);
эквивалентен вызову
scanf([строка формата],[список адресов переменных]);
Аналогично,
fprintf(stdout, [строка формата],[список переменных, констант]);
эквивалентно
printf([строка формата],[список переменных, констант]);
|
|
Рассмотрим примеры программ, использующих эти функции.
Пример 3. В программе создается массив, состоящий из четырех целых чисел. Вывести массив в файл:
#include "stdafx.h"
#define n 4
int main()
{
int i=0;
int array[n]={4,44,446,4466}; //описание и инициализация масcива
FILE *out; //описание указателя на файл
out=fopen("num_arr.txt","w"); //открытие файла для записи
for(;i<n;i++)
fprintf(out,"%6d",array[i]); //запись в файл элемента массива
fclose(out); //закрытие файла
return 0;
}
В результате выполнения программы в файл num_arr.txt будет помещена следующая информация:
Пример 4. Имеется файл данных, содержащий целые числа, разделенные пробелами. Количество чисел в файле неизвестно. Требуется найти среднее арифметическое значение этих чисел:
#include "stdafx.h"
int main()
{
int S=0, count=0, numb; //описание переменных
FILE *in; //описание укателя на файл
if((in=fopen("num_arr.txt","r"))!=NULL)/*открытие файла для чтения*/
{
while (!feof(in)) //пока не конец файла
{
fscanf(in,"%d",&numb); //читать из файла число в переменную numb
S+=numb; // добавить numb в сумму
count++; //увеличиваем счетчик на 1 количество
printf("%d\n", numb); //выводим значение numb на экран
}
double aver=(double)S/count; //считаем среднее значение
printf("Average=%lf\n", aver); //вывод среднего значения
fclose(in); //закрыть файл
}
else
printf("\nФайл не найден!");
return 0;
}
Чтение чисел из файла выполняется в переменную numb до тех пор, пока не будет достигнут конец файла. Одновременно ведется подсчет количества прочитанных чисел в переменной count и накопление суммы прочитанных чисел в переменной S. Переменные S и count целые, поэтому для правильного вычисления среднего арифметического, необходимо выполнить преобразование одной из этих переменных в формат double.
Рассмотрим другие библиотечные функции, используемые для работы с файлами (все они описаны в файле stdio.h):
1. Функция fputs() записывает строку символов в файл. Она отличается от функции puts() тем, что в качестве второго параметра должен быть записан указатель на переменную файлового типа.
Например:
fputs("Ехаmple", fp);
При возникновении ошибки возвращается значение EOF.
2. Функция fgets() читает строку символов из файла. Она отличается от функции gets() тем, что в качестве второго параметра должно быть указано максимальное число вводимых символов плюс единица, а в качестве третьего - указатель на переменную файлового типа. Строка считывается целиком, если ее длина не превышает указанного числа символов, в противном случае функция возвращает только заданное число символов.
Рассмотрим пример:
fgets(string, n, fp);
Функция возвращает указатель на строку string при успешном завершении и константу NULL в случае ошибки либо достижения конца файла.
3. Функция fread() предназначена для чтения блоков данных из потока. Имеет прототип:
unsigned fread(void *ptr,unsigned size,unsigned n,FILE *fp);
Она читает n элементов данных, длиной size байт каждый, из заданного входного потока fp в блок, на который указывает указатель ptr. Общее число прочитанных байтов равно произведению n*size. При успешном завершении функция fread() возвращает число прочитанных элементов данных, при ошибке - 0.
4. Функция fwrite() предназначена для записи в файл блоков данных. Имеет прототип:
unsigned fwrite(void *ptr,unsigned size,unsigned n, FILE *fp);
Она добавляет n элементов данных, длиной size байт каждый, в заданный выходной файл fp. Данные записываются с позиции, на которую указывает указатель ptr. При успешном завершении операции функция fwrite() возвращает число записанных элементов данных, при ошибке - неверное число элементов данных.
|
|
5. Функция fseek() позволяет выполнять чтение и запись с произвольным доступом и имеет следующий прототип:
int fseek(FILE *fp, long count, int access);
Здесь fp - указатель на файл, возвращенный функцией fopen(), count - номер байта относительно заданной начальной позиции, начиная с которого будет выполняться операция, access - способ задания начальной позиции.
Переменная access может принимать следующие значения:
0 - начальная позиция задана в начале файла;
1 - начальная позиция считается текущей;
2 - начальная позиция задана в конце файла.
При успешном завершении возвращается нуль, при ошибке - ненулевое значение.
6. Функция ferror() позволяет проверить правильность выполнения последней операции при работе с файлами. Имеет следующий прототип:
int ferror(FILE *fp);
В случае ошибки возвращается ненулевое значение, в противном случае возвращается нуль.
7. Функция remove() удаляет файл и имеет следующий прототип:
int remove(char *file_name);
Здесь file_name - указатель на строку со спецификацией файла. При успешном завершении возвращается нуль, в противном случае возвращается ненулевое значение.
8. Функция rewind() устанавливает указатель текущей позиции в начало файла и имеет следующий прототип:
void rewind(FILE *fp);