8(495)909-90-01
8(964)644-46-00
pro@sio.su
Главная
Системы видеонаблюдения
Охранная сигнализация
Пожарная сигнализация
Система пожаротушения
Система контроля удаленного доступа
Оповещение и эвакуация
Контроль периметра
Система домофонии
Парковочные системы
Проектирование слаботочных сетей
Аварийный
контроль
Раздел: Документация

0 ... 141 142 143 144 145 146 147 ... 365

Используйте команду м = fscanf (f, %g, [3 4]) для заполнения матрицы данными из файла и выведите ее содержимое в командное окно. Матрица считалась из файла в заданном виде.

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

Ы = fscanf(f, %g, [4 3]) К = fscanf(f, %g, [6 2]) P = fscanf(f, g , [12 1]) R = fscanf(f, g, [2 6])

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

Информация, хранящаяся в файле, может представлять собой таблицу определенной структуры, например, такой, как в листинге 8.11. Все столбцы имеют одинаковое назначение и содержат элементы одного типа. Использование массивов структур значительно облегчает работу с подобными файлами. Напишите самостоятельно файл-функцию readgroup для считывания данных в массив структур с полями Family, Name (строковые переменные), Year (числовая переменная), Marks (вектор-строка из целых чисел). Имя текстового файла задается во входном аргументе readgroup, а выходным аргументом является массив структур (доступ к полям структур массива описан в разд. "Массивы структур" данной главы). Реализуйте следующий алгоритм в файл-функции.

1.Первая строка является шапкой таблицы, ее не следует заносить в структуру. Используйте функцию fgetl для считывания первой строки.

2.Примените поэлементное считывание в подходящих форматах для заполнения структур массива информацией, содержащейся в каждой строке файла, начиная со второй.

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

4.Считывание производите в цикле while, пока не будет достигнут конец файла.

5.При считывании оценок в вектор-строку задайте требуемый размер (один на шесть) в третьем аргументе fscanf.


Листинг 8.16 содержит возможный вариант файл-функции readgroup.

; Листинг 8.16. Файл-функция readgroup для считывания информации из файла I в массив структур

function GROUP = readgroup(filename)

% Файл-функция для считывания таблицы с успеваемостью группы

% студентов из текстового файла в массив структур.

% Использование writegroup(filename, GROUP)

% filename — имя файла

% group — массив структур с полями

%Family (строка), Name (строка), Year (число),

%Marks [вектор-строка с шестью отметками)

& Открытие текстового файла с именем filename для записи F = fopen(filename, rt);

% Считывание первой строки с шапкой таблицы if feof(F) == О line = fgeti(F);

end

6 Обнуление счетчика числа студентов count = 0;

4 Создание пустого массива структур GROUP = ( ];

" Последовательное считывание строк (начиная со второй)

% и распределение информации, содержащейся в ней,

% по полям структур массива GROUP. Каждая строка файла

% содержит информацию об одном студенте

while feoffF) == 0

count = count + 1; % увеличение счетчика студентов

i Считывание строки с фамилией

GROUP(count).Family = fscanf(F, %s, 1);

% Считывание строки с именем

GROUP(count).Name = fscanf(F, %s, 1);

% Считывание года рождения

GROUP(count).Year = fscanf(F, %d, 1);


% Считывание массива с оценками в вектор-столОец GROUP (count) .Marks = fscanf (F, %d, [1, 6]) ,-end

% Закрытие файла fciose(F);

Операции с массивами структур

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

Добавление нового поля во все структуры массива осуществляется при помощи оператора присваивания, в левой части которого задается название нового поля, а в правой части — его значение для данной структуры массива. Дополните первую структуру массива GR201 (листинг 8.8) полем NBook, содержащим номер зачетной книжки студента:

GR201U) .NBook = 127001;

Проверьте, что поле NBook добавилось во все структуры массива. Наберите GR201 в командной строке и нажмите <Enter> для получения информации о массиве структур. Значение 127001 занесено в поле NBook только первой структуры, поле NBook остальных структур пока содержат пустые массивы, например:

» GR201(2).NBook ans =

[ ]

Заполнение поля NBook остальных структур производится аналогичными операторами присваивания.

Для удаления поля простой структуры мы использовали функцию rmfieid. В случае массива структур она удаляет выбранное поле во всех структурах массива. Первым ее входным аргументом является имя массива, а вторым — строка или строковая переменная с названием поля. Преобразованная структура возвращается в выходном аргументе rmfieid. Удалите, например, поле Year из структур массива GR201 (см. листинг 8.8) и запишите результат в массив g20i:

g201 = rmfieid(GR201, Year)

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



0 ... 141 142 143 144 145 146 147 ... 365