Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебник Моя первая программа на С++.docx
Скачиваний:
3
Добавлен:
01.07.2025
Размер:
6 Мб
Скачать
☆

Двоичный формат

Для сохранения числовых переменных в двоичном формате используется функция fwrite(). Записанные таким образом данные на диске займут столько

же места, сколько и в памяти. Если просмотреть содержимое такого файла с помощью команды TYPE, мы увидим на месте числовых значений бессмысленные буквы и значки. Это ASCII-символы, эквивалентные записанным в файл значениям.

Для чтения файла, записанного с помощью fwrite(), следует использовать функцию fread(). Вводить дан- ные следует в структуру, имеющую строение, соответствующее сохраненным ранее данным. Структура может иметь другое имя, имена членов структуры тоже могут отличаться, но порядок, типы и размеры членов обеих структур должны совпадать.

Печать данных

С технической точки зрения вывести данные на принтер можно с помощью любой функции вывода: по- символьно, построчно, форматированными строками или структурами. Единственное, что необходимо,— это указать имя файла "prn" и режим доступа "w".

Однако «поструктурная» печать с помощью функции fwrite() практически не используется, так как число- вые данные при этом будут напечатаны в двоичном формате в виде загадочных символов. Вместо этого для печати структур используется функция fprintf(), как это показано в Листинге12.9. В этой программе открываются два файла: дисковый файл открывается для чтения, а файл принтера— для вывода.

Листинг 12.9. Чтение и печать содержимого дискового файла.

/*fread1.c*/

#include "stdio.h" main()

{

FILE *fp; struct CD

{

char name[20];

char description[40]; char category[12]; float cost; int number;

} disc;

char filename[25]; printf("Введите имя файла: "); gets(filename);

if((fp = fopen(filename, "r")) == NULL)

{

printf("Невозможно открыть файл

%s\n", filename);

exit();

}

if((ptr = fopen("PRN", "w")) == NULL)

{

printf("Принтер не готов к

работе\n", filename);

fclose(fp); exit();

}

while (fread(&disc, sizeof(disc), 1, fp) == 1)

{

fprintf(ptr, "Название диска

%s\n", disc.name);

fprintf(ptr, "Описание:

%s\n", disc.description);

fprintf(ptr, "Категория:

%s\n", disc.category);

fprintf(ptr, "Стоимость:

%6.2f\n", disc.cost);

fprintf(ptr, "Номер п/п:

%d\n", disc.number);

fprintf(ptr, "\n\n");

}

fclose(ptr); fclose(fp);

}

Каждая структура целиком вводится функцией fread(), после чего отдельные члены структуры печатаются с использованием функции fprintf(). Функция fread() может читать строки, включающие пробелы, поэтому ее применение предпочтительнее, чем использование функции fscanf().

Инструкции

fprintf(ptr, "\n\n");

выводят по две пустые строки между отдельными структурами CD.

Проектирование программы

Знание того, как осуществляется запись в дисковый файл и чтение из него, открывает перед вами воз- можность создания сложных приложений. В этой главе все программы, которые демонстрировали ввод данных из дискового файла, читали его целиком. Но можно представить себе ситуацию, когда вы захотите поступить с данными каким-либо другим образом.

Например, вам может понадобиться просмотреть дисковый файл в поисках определенной записи. В этом случае следует открыть файл с режимом доступа "r", а потом использовать цикл для постепенного ввода данных, структура за структурой или строка за строкой в зависимости от того, к какому типу относится информация, записанная в файл. Во время каждого прохождения цикла

значения вводимых данных сравниваются с искомыми. Для проверки значений строк используйте функ- цию strcmp(), конечно, если ваш компилятор это позволяет. Как только искомые данные найдены, они выводятся на экран, после чего файл закрывается.

Функции работы с файлами, описанные в этой главе, выполняют последовательные операции. Это озна- чает, что они выполняют чтение файла от его начала. Вы можете использовать режим доступа "a" для то- го, чтобы добавить данные в конец файла, но вы не можете перейти прямо к определенной позиции в файле, чтобы изменить хранящуюся там информацию.

Это не означает, что информацию, хранящуюся в файле, вообще нельзя изменить. Существует алгоритм, позволяющий обращаться к содержимому файла последовательно. Вы познакомитесь с этим и другими алгоритмами в многочисленных примерах, которые приведены в следующей главе.