Раздел: Документация
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
|