АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Функции fscanf() и fprintf() выполняют форматированный ввод/вывод

Читайте также:
  1. II. Основные задачи и функции
  2. III. Предмет, метод и функции философии.
  3. XVIII. ПРОЦЕДУРЫ И ФУНКЦИИ
  4. А) ПЕРЕДАЧА НА РУССКОМ ЯЗЫКЕ ФУНКЦИИ АРТИКЛЯ
  5. А. Средняя квадратическая погрешность функции измеренных величин.
  6. Абстрактные классы и чистые виртуальные функции. Виртуальные деструкторы. Дружественные функции. Дружественные классы.
  7. Адаптивные функции
  8. Администраторы судов, их функции
  9. Алгебраическое интерполирование функции.
  10. Анализ функции логики высказываний
  11. Аналитические функции
  12. Арендная плата: состав и функции

Чтение из файла выполняет функция 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);


1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 |

Поиск по сайту:



Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.005 сек.)