В этом пункте при работе с двоичными файлами используются структуры.
Пример 1.Работа с файлом структур, каждая из которых содержит информацию о компьютере.
/* Объявляем глобально тип структуры (tComp) , переменную этого типа (pibm) и указатель файла (lf), которые будут использоваться в нескольких функциях. */
struct tComp {
char model[15]; // Модель (или название) компьютера.
/* 2. В цикле подготовка одной записи, то есть полей структуры. Здесь ввод с экрана. Кроме этого, в других задачах некоторые поля могут вычисляться, вводиться из другого файла и т.д */
printf("model ->");
scanf ("%s", pibm.model); //Ввод модели компьютера.
/* 3. Программируем условие выхода из цикла. Например, если в наименовании модели введём три и более подряд идущих символа ‘0’, то заканчиваем создание файла. Желательно, чтобы ввод поля, с помощью которого осуществляется проверка выхода из цикла, выполнялся как можно раньше, то есть в начале тела цикла. В противном случае придётся “вхолостую” вводить значения многих полей, которые не будут записаны в файл. */
Здесь buf — указатель на область оперативной памяти, из которой информация записывается в файл. В нашем примере это указатель на структуру. Тип void здесь означает, что если файл открыт как двоичный, то в зависимости от конкретной задачи можно использовать указатель на данные других типов. Например, в следующем пункте будем использовать указатель на массив. Допускается и указатель на переменную простого типа. Для текстового файла это указатель на массив символов. Функция за один вызов записывает count элементов (порций информации) длиной size байт каждый из области оперативной памяти, определяемой с помощью buf, в файл, связанный с потоком stream. В нашем примере записывается одна структура. Указатель позиции в файле продвигается вперёд на количество записанных байт (символов).
Функция возвращает количество действительно записанных блоков (в смыле порций информации) по size байт каждый, которое в случае успешной записи равно указанному при вызове количеству count. Если это количество меньше, чем указано при вызове, то это означает, что произощла ошибка. Например, недостаточно места при записи блока.
Здесь, как и в строковых функциях, size_t — это беззнаковый целый тип. */
/* Чтение и анализ файла. Используя созданный в предыдущей функции файл, найдём количество компьютеров, память которых больше заданной. Для чтения файла необходимо предусмотреть следующие этапы: */
void MyRead()
{ int nRec=0, // Номер записи
kComp=0, // Количество компьютеров с заданным условием.
mem0; // Для критерия выбора записей
clrscr();
/* Ввод значения переменной mem0, которая будет использоваться в критерии анализа прочитанных записей. */
Здесь buf — указатель на область оперативной памяти, в которую будет помещена информация после чтения из файла. В нашем примере это указатель на структуру. Тип void здесь означает, что если файл открыт как двоичный, то в зависимости от конкретной задачи можно использовать указатель на данные других типов. Например, в следующем пункте будем использовать указатель на массив. Допускается и указатель на переменную простого типа. Для текстового файла это указатель на массив символов. Функция за один вызов читает count элементов (порций информации) длиной size байт каждый из файла, связанного с потоком stream, в область оперативной памяти, определяемой с помощью buf. В нашем примере читается одна структура. Указатель позиции в файле продвигается вперёд на size*count, т. е. количество прочитанных байт (символов).
Функция возвращает количество действительно прочитанных блоков (порций информации), которое в случае успешной записи равно указанному при вызове количеству count. Если это количество реально прочитанных объектов меньше, чем указано при вызове, то это означает, что произощла ошибка чтения или достигнут конец файла.
Здесь, как и в строковых функциях, size_t — это беззнаковый целый тип.
Функция добавления в конец файла почти ничем не отличается от функции создания файла. Предлагается её написать самостоятельно. Не забудьте при открытии файла вместо режима “wb” указать “ab”.*/