Лысаков. Основы программирования (1247269), страница 12
Текст из файла (страница 12)
Эти функции позволяют читать и записывать блоки данныхлюбого типа. Их прототипы следующие:void main(void){FILE *fp;double d = 12.23;int i = 101;long l = 123023L;size_t fread(void *буфер, size_t колич_байт,size_t счетчик, FILE * файл);size_t fwrite(const void *буфер, size_t колич_байт,size_t счетчик, FILE * файл);if((fp=fopen("test", "wb+"))==NULL) {printf("Error");return;}Для fread() буфер — это указатель на область памяти, в которую будутпрочитаны данные из файла. А для fwrite() буфер — это указатель наданные, которые будут записаны в файл.
Значение счетчик определяет,fwrite(&d, sizeof(double), 1, fp);fwrite(&i, sizeof(int), 1, fp);fwrite(&l, sizeof(long), 1, fp);сколько считывается или записывается элементов данных, причем длинакаждого элемента в байтах равна колич_байт. (Вспомните, что тип size_tопределяется как одна из разновидностей целого типа без знака.) И,rewind(fp);наконец, уф — это указатель файла, то есть на уже открытый поток.fread(&d, sizeof(double), 1, fp);fread(&i, sizeof(int), 1, fp);fread(&l, sizeof(long), 1, fp);Функция fread() возвращает количество прочитанных элементов. Еслидостигнут конец файла или произошла ошибка, то возвращаемое значениеможет быть меньше, чем счетчик.
А функция fwrite() возвращаетprintf("%f %d %ld", d, i, l);количество записанных элементов. Если ошибка не произошла, товозвращаемый результат будет равен значению счетчик.7.14.1.Использование fread() и fwrite()Как только файл открыт для работы с двоичными данными, fread() иfwrite() соответственно могут читать и записывать информацию любоготипа. Например, следующая программа записывает в дисковый файлданные типов double, int и long, a затем читает эти данные из того же99}fclose(fp);Как видно из этой программы, в качестве буфера можно использовать(и часто именно так и делают) просто память, в которой размещенапеременная.Вэтойпростойпрограммезначения,возвращаемыефункциями fread() и fwrite(), игнорируются.
Однако на практике этизначения необходимо проверять, чтобы обнаружить ошибки.100www.phys.nsu.ruОдним из самых полезных применений функций fread() и fwrite()этот файл и выводит информацию на экран. После запуска программыявляется чтение и запись данных пользовательских типов, особеннопроверьте, каким получится файл test. Как вы и увидите, в нем будетструктур. Например, если определена структура:вполне удобочитаемый текст.struct struct_type{float balance;char name[80];} cust;то следующий оператор записывает содержимое cust в файл, накоторый указывает fp:#include <stdio.h>#include <io.h>#include <stdlib.h>void main(void){FILE *fp;char s[80];int t;if((fp=fopen("test", "w")) == NULL){printf("Error\n");return;}fwrite(&cust, sizeof(struct struct_type), 1, fp);7.15.
Функции fprinf() и fscanf()printf("Введите строку и число: ");Кроме основных функций ввода/вывода, о которых шла речь, в системе/* читать с клавиатуры */fscanf(stdin, "%s%d", s, &t);ввода/вывода языка С также имеются функции fprintf() и fscanf(). Эти двефункции, за исключением того, что предназначены для работы с файлами,/* писать в файл */fprintf(fp, "%s %d", s, t);fclose(fp);ведут себя точно так же, как и printf() и scanf(). Прототипы функцийfprintf() и fscanf() следующие:if((fp=fopen("test","r")) == NULL){printf("Error\n");return;}int fprintf(FILE *файл, const char *строка, ...);int fscanf(FILE *файл, const char *строка, ...);Операции ввода/вывода функции fprintf() и fscanf() выполняют с темфайлом, указанным в параметрах функции.В качестве примера предлагается рассмотреть следующую программу,fscanf(fp, "%s%d", s, &t);fprintf(stdout, "%s %d", s, t);}которая читает с клавиатуры строку и целое значение, а затем записываетих в файл на диске; имя этого файла — test.
После этого программа читает101102www.phys.nsu.ruМаленькое предупреждение. Хотя читать разносортные данные изУчебное изданиефайлов на дисках и писать их в файлы, расположенные также на дисках,часто легче всего именно с помощью функций fprintf() и fscanf(), но это невсегда самый эффективный способ выполнения операций чтения и записи.Так как данные в формате ASCII записываются так, как они должныЛысаков Константин Федоровичпоявиться на экране (а не в двоичном виде), то каждый вызов этихфункций сопряжен с определенными накладными расходами. Поэтому,если надо заботиться о размере файла или скорости, то, скорее всего,придется использовать fread() и fwrite().СТРУКТУРНЫЙ И ОБЪЕКТНО-БАЗИРОВАННЫЙПОДХОДЫ В ПРОГРАММИРОВАНИИ НА ПРИМЕРЕЯЗЫКОВ С И С++УЧЕБНОЕ ПОСОБИЕ103104.