Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
АиПА / include / algraph.doc
Скачиваний:
16
Добавлен:
07.02.2016
Размер:
582.14 Кб
Скачать

7. Ввод/вывод и преобразование файлов

Для сохранения графов в дисковых файлах могут использоваться файлы нескольких типов. Связь между расширением имени файла и форматом сохраняемых данных:

.gt- таблицы связей в текстовой форме,

.bic- бинарные коды в текстовом 16-ричном формате;

.r- бинарные коды графов в бинарной форме.

Функции класса graph

graph& graph::operator<<(FILE*)

graph& graph::operator>>(FILE*)

перегружают символы "<<" и ">>" для выполнения операций ввода и вывода graph-объектов в текстовой форме во внешнем формате, предусмотренном для таблицы связей. Пусть, например, переменнаяgтипаgraphсоответствует графу из рис.1. Тогда выполнение строки

g >> f;

приведет к выводу таблицы связей графа в файл с указателем f. При этом вывод будет осуществлен в следующем формате:

0 7

1 2 2 5

2 3 1 4 6

3 1 4

4 4 2 3 6 7

5 2 1 6

6 4 2 4 5 7

7 2 4 6

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

В примере, приведенном ниже, из файла fin.gtчитается таблица связей графаg, выполняется упорядочивание номеров вершин в ее строках и после этого значениеgзаписывается в файлfout.gt.

FILE* in = fopen("fin.gt","r");

FILE* out = fopen("fout.gt","w");

graph g;

g<<in; g.rgl(); g>>out;

Для вывода таблицы связей графа gна экран можно записать вывод переменнойgв стандартное устройство выводаstdout:

g>>stdout;

Функции класса graph

Int write_r(file*)

Int read_r(file*)

позволяют записывать в файл и считывать из файла бинарный код графа. Функция write_rвначале преобразует таблицу связей в бинарный код необходимой длины и затем записывает его в файл в режиме бинарного доступа. Функцияread_rсчитывает бинарный код из файла и формирует соответствующую таблицу связей. При этом передаваемый бинарный код является "чистым", т.е. не включает непосредственно число вершин графа. В связи с этим функцииread_rиwrite_rиспользуются для работы с файлами, которые содержат наборы бинарных кодов графов с одинаковым числом вершин. Имена таких файлов имеют расширение.r. Первые 12 байтов такого файла образуют шапку, поля которой содержат общую информацию о его содержимом, далее располагаются бинарные коды.Общая структураr-файла приведена ниже.

nv: число вершин (2 байта)

nr: число ребер (2 байта)

Ng: количество бинарных кодов (4 байта)

KS: контрольная сумма (4 байта)

1-й бинарный код

2-й бинарный код

..............................

В r-файл можно записывать бинарные коды графов с числом вершинnv1024.

Если используемый r-файл содержит бинарные коды графов с неодинаковым числом ребер, полеnrпо прямому назначению (или вовсе) не используется.

В связи с тем, что бинарные коды не содержат непосредственно число вершин графа, последнее берется из объекта, для которого вызывается функция readbic. Например, если мы имеем файлin.rи объявление переменнойg:

graph g;

то для того, чтобы выполнить чтение бинарного кода из файла in.rв переменнуюg, необходимо занести в нее информацию о числе вершин считываемого графа. Например, при считывании бинарного кода 20-вершинного графа в переменнуюgэта операция может быть записана таким способом:

g = 20; g.readbic();

или так:

(g=20).readbic();

Соседние файлы в папке include