Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование на C / C++ / Нейбауэр А. Моя первая программа на С.doc
Скачиваний:
182
Добавлен:
02.05.2014
Размер:
3.75 Mб
Скачать

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

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

Компиляторы Си++ и многие компиляторы, поддерживающие стандарт ANSI языка Си, позволяют создавать форматированные двоичные файлы для хранения числовых данных. Файл создается с режимом доступа "wb" и читается с режимом доступа "rb". Символ b указывает на двоичный формат. Если открыть файл с таким режимом доступа, можно записывать в файл целочисленные значения с помощью функции putw() и читать их из файла с помощью функции getw().

же места, сколько и в памяти. Если просмотреть содержимое такого файла с помощью команды 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.