Fclose(fo);
return 0;
}
Функции fscanf() и fprintf() выполняют форматированный ввод/вывод.
Чтение из файла выполняет функция fscanf():
fscanf(fin,["строка формата"],[список адресов переменных]);
Функция возвращает количество введенных из файла значений или EOF.
Запись в файл осуществляет функция fprintf():
fprintf(out,["строка формата"],[список переменных, констант]);
Возвращает количество выведенных в файл байт (символов) или EOF.
Строка формата функций fscanf() и fprintf() формируется так же, как было описано ранее в главе, посвященной консольному вводу/выводу и функциям printf() и scanf().
Следует заметить, что вызов функции
fscanf(stdin,[строка формата],[список адресов переменных]);
эквивалентен вызову
scanf([строка формата],[список адресов переменных]);
Аналогично,
fprintf(stdout, [строка формата],[список переменных, констант]);
эквивалентно
printf([строка формата],[список переменных, констант]);
Рассмотрим примеры программ, использующих эти функции.
Пример 4. В программе создается массив, состоящий из четырех целых чисел. Вывести массив в файл:
#include "stdafx.h"
#define n 4
int main()
{
int array[n]={4,44,446,4466}; /*описание и инициализация масcива */
FILE *out; //описание указателя на файл
out=fopen("num_arr.txt","w"); //открытие файла для записи
for(int i=0;;i<n;i++)
fprintf(out, "%6d",array[i]); //запись в файл элемента массива
fclose(out); //закрытие файла
return 0;
}
В результате выполнения программы в файл num_arr.txt будет помещена следующая информация:
Пример 5. Имеется файл данных, содержащий целые числа, разделенные пробелами. Количество чисел в файле неизвестно. Требуется найти среднее арифметическое значение этих чисел:
#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.
Функция fread() предназначена для чтения блоков данных из потока. Имеет прототип:
unsigned fread(void *ptr,unsigned size,unsigned n,FILE *fp);
Она читает n элементов данных, длиной size байт каждый, из заданного входного потока fp в блок, на который указывает указатель ptr. Общее число прочитанных байтов равно произведению n*size. При успешном завершении функция fread() возвращает число прочитанных элементов данных, при ошибке - 0.
Функция fwrite() предназначена для записи в файл блоков данных. Имеет прототип:
unsigned fwrite(void *ptr,unsigned size,unsigned n,FILE *fp);
Она добавляет n элементов данных, длиной size байт каждый, в заданный выходной файл fp. Данные записываются с позиции, на которую указывает указатель ptr. При успешном завершении операции функция fwrite() возвращает число записанных элементов данных, при ошибке - неверное число элементов данных.
Примеры использования функций fread()и fwrite() будут приведены позже при рассмотрении работы с бинарными файлами.
Рассмотрим другие библиотечные функции, используемые для работы с файлами:
1. Функции fseek( ) и ftell().
Несмотря на то, что указатель позиции в файле перемещается автоматически, в языке С++ имеются функции fseek() и ftell(), позволяющие программно управлять положением позиции в файле.
Функция ftell() возвращает значение указателя текущей позиции файла.
Функция fseek() устанавливает указатель в позиция файла в соответствии со значениями своих параметров.
Синтаксис данных функций следующий:
int fseek( FILE *stream, long offset, int origin );
long ftell( FILE *stream );
где *stream – указатель на файл; offset – смещение позиции в файле (в байтах); origin – флаг начального отсчета, который может принимать значения: SEEK_END – конец файла, SEEK_SET – начало файла; SEEK_CUR – текущая позиция. Последняя функция возвращает номер текущей позиции в файле.
Пример 6. Рассмотрим действие данных функций на примере считывания символов из файла в обратном порядке.
#include "stdafx.h"
#include <string.h>
int main(void)
{
FILE *fp=fopen("my_file.txt","w"); //открытие файла для записи
if(fp != NULL)
{
fprintf(fp,"It is an example using fseek and ftell functions."); //запись в файл текста
}
fclose(fp); //закрытие файла
fp = fopen("my_file.txt","r"); //открытие файла для чтения
if(fp != NULL)
{
char ch;
fseek(fp,0L,SEEK_END); //указатель перемещен в конец файла
long length = ftell(fp);//определение размера файла
printf("length = %ld\n",length);
for(int i = 1;i <= length;i++) //цикл для чтения
{
fseek(fp,-i,SEEK_END);//перемещение на нужную позицию
ch = getc(fp);
putchar(ch);
}
}
fclose(fp);
return 0;
}
В данном примере сначала создается файл, в который записывается строка “It is an example using fseek and ftell functions.”. Затем этот файл открывается на чтение и с помощью функции fseek(fp,0L,SEEK_END) указатель позиции помещается в конец файла. Это достигается за счет установки флага SEEK_END, который перемещает позицию в конец файла при нулевом смещении. В результате функция ftell(fp) возвратит число символов в открытом файле. В цикле функция fseek(fp,-i,SEEK_END) смещает указатель позиции на –i символов относительно конца файла, после чего считывается символ функцией getc(), стоящий на i-й позиции с конца. Так как переменная i пробегает значения от 1 до length, то на экран будут выведены символы из файла в обратном порядке.
2. Функция ferror() позволяет проверить правильность выполнения последней операции при работе с файлами. Имеет следующий прототип:
int ferror(FILE *fp);
В случае ошибки возвращается ненулевое значение, в противном случае возвращается нуль.
3. Функция remove() удаляет файл и имеет следующий прототип:
int remove(char *file_name);
Здесь file_name - указатель на строку со спецификацией файла. При успешном завершении возвращается нуль, в противном случае возвращается ненулевое значение.
4. Функция rewind( ) устанавливает указатель текущей позиции в начало файла и имеет следующий прототип:
void rewind(FILE *fp);
Дата добавления: 2015-02-10; просмотров: 565;