Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Кетков.doc
Скачиваний:
17
Добавлен:
27.09.2019
Размер:
2.22 Mб
Скачать

11.3. Структурированные файлы

Структурированный файл является частным случаем двоичного файла, в котором в качестве порции обмена выступает структура языка C, являющаяся точным аналогом записи в Паскале. По сравнению с предыдущим примером использование записей позволяет сократить количество обращений к функциям fread/fwrite, т.к. в одном обращении участвуют все поля записи.

Инициализация структурированного файла выполняется точно таким же способом, как и подготовка к работе двоичного файла.

Пример 3. Приведенная ниже программа является модификацией предыдущего примера. Единственное ее отличие состоит в использовании структуры (записи) b, состоящей из символьного (b.s, 5 байт, включая нулевой байт – признак конца строки), целочисленного (b.n, 2 байта в BC и 4 байта в BCB) и вещественного (b.r, 4 байта) полей.

#include <stdio.h>

#include <stdlib.h>

#include <math.h>

#include <string.h>

#include <conio.h>

main( )

{ FILE *f1;

int j,k;

struct {

char s[5];

int n;

float r;

} b;

strcpy(b.s,"Line");

f1=fopen("c_rec","wb");

for(j=1;j<11;j++)

{ b.n=j; b.r=sqrt(j);

fwrite(&b,sizeof(b),1,f1);

printf("\n%s %d %f",b.s,b.n,b.r);

}

fclose(f1);

printf("\n");

f1=fopen("c_rec","rb");

for(j=10; j>0; j--)

{ fseek(f1,(j-1)*sizeof(b),SEEK_SET);

fread(&b,sizeof(b),1,f1);

printf("\n%s %d %f",b.s,b.n,b.r);

}

getch();

}

Результат работы этой программы ничем не отличается от предыдущего примера.

11.4. Форматные преобразования в оперативной памяти

Библиотека языков C, C++ включает две функции sprintf и sscanf, с помощью которых реализуются прямые и обратные форматные преобразования данных в оперативной памяти. Техника их использования ничем не отличается от уже рассмотренных функций printf/fprintf и scanf/fscanf. Разница только в том, что первым аргументом новых функций является указатель на строку – массив типа char, расположенный в оперативной памяти. Для функции sscanf эта строка является источником данных, а для функции sprintf в эту строку помещаются результаты преобразования данных из машинного представления:

sscanf(str,"список_форматов", список_ввода);

sprintf(str,"список_форматов \n",список_вывода);

К форматным преобразованиям в оперативной памяти можно прибегнуть и при работе с двоичным файлом. Перед записью в файл с помощью функции sprintf машинные форматы данных преобразуются в символьную строку, которая потом записывается в двоичный файл. По сути дела, такое же преобразование происходит при записи данных в текстовый файл

11.5. Файловые процедуры в системе bcb

Визуальная среда программирования BCB поддерживает все описанные выше функции работы с файлами и предлагает дополнительный набор средств ориентированных на возможности операционной системы Windows. Главные отличия новых процедур заключаются в двух моментах. Во-первых, вместо указателя на блок управления файлом здесь используется условный целочисленный номер (мы будем обозначать его через fHandle), который операционная система присваивает каждому открываемому файлу (термин handle на американском сленге звучит как кликуха, кличка). Во-вторых, почти все строковые константы, используемые в качестве параметров процедур, имеют тип AnsiString. Это новый тип (класс) строковых данных, упрощающий манипуляции над строками. Чаще всего в рассматриваемых ниже процедурах фигурирует строка с именем файла – FileName (на самом деле, в его качестве может выступать и полная спецификация файла).