- •Лабораторная работа №12 Файловые операции в Matlab
- •Структуры
- •Массив структур
- •Текстовые файлы
- •Запись в текстовый файл
- •Форматный вывод
- •Запись данных массивов структур в текстовый файл
- •Считывание информации из текстового файла
- •Контрольные вопросы
- •Рекомендуемая дополнительная литература
- •Требования к оформлению отчета
Форматный вывод
Схема использования fprintf при работе с числовыми переменными такова:
fprintf(идентификатор, 'список форматов', список переменных)
Здесь первый аргумент, как и в случае вывода строк, является идентификатором файла, второй – строка с кодами форматов, которые определяют вид записи значений переменных из списка, заданного третьим аргументом. В списке может быть одна или несколько переменных, в том числе и массивов.
Пример 2.
Требуется записать значения переменных х = -pi/4 и у - sin(x) в файл в формате с плавающей точкой, оставляя четыре цифры после десятичной точки для х и восемь цифр – для у.
Файл-программа, решающая данную задачу
% форматный вывод в текстовый файл
[F, mes] = fopen('twonum.txt', 'w');
x = -pi/4;
y = sin(x);
fprintf(F, '%7.4f%11.8f', x, y);
fclose(F);
Обратите внимание на второй аргумент команды fprintf. Код %7.4f задает формат вывода переменной х, которая расположена на первом месте в списке вывода. Знак процента указывает на начало формата, цифра 7 обозначает, что всего под значение переменной х отводится семь позиций (включая десятичную точку и место под знак, которое резервируется и для положительных чисел), цифра 4 после разделителя-точки обеспечивает точность отображения результата – четыре цифры после десятичной точки. Спецификатор f указывает на то, что следует вывести число в формате с плавающей точкой. Аналогичным образом работает формат %11.8f для вывода у. При использовании форматного вывода следует учесть, что если количество элементов в списке вывода больше числа кодов формата, то форматные коды применяются повторно, начиная с первого. После выполнения файл-программы из примера файла twonum.txt составляют два числа – значения переменных х и у с требуемым числом цифр, выводимых на экран ранее написанной функцией myview:
-0.7854-0.70710678
Соответствие форматов и получаемого результата приведено на схеме, изображенной на рис. 1, каждая позиция подчеркнута.
Рис. 1. Схема соответствия форматов вывода и результата
Значения х и у вывелись одно за другим без разделителя, что затрудняет чтение результата. Можно было бы указать в списке форматов больше позиций под вывод второго числа, например, '%7.4f%15.8f'. Поскольку у меньше единицы и выравнивание числа в выделенном для него поле по умолчанию производится по правому краю, то числа в данном случае будут разделены пробелами. Но если в примере 2 заменить у = sin(x) на у =1000000*sin (x), то числа снова не будут разделены. Кроме того, пятнадцати позиций не хватило под вывод у с восьмью знаками после десятичной точки, и MATLAB автоматически увеличил поле вывода. Поэтому при задании форматов следует предусмотреть некоторые разделители между числами.
Форматы данных можно разделять любым текстом, включая пробелы, который запишется в текстовый файл между соответствующими значениями.
Задание 5.
Внесите изменения в команду fprintf файл-программы, приведенной в примере 2. Дополните запись в файл некоторыми пояснениями, так как приведено ниже
fprintf (F, 'х = %7.4f у = %11.8f', x, y );
и выполните файл-программу. Покажите содержимое файла twonum.txt.
Помещение символа \n в список форматов приводит к последующему выводу данных с новой строки. Кроме f, допустимы и другие спецификаторы форматов, в частности, спецификатор е означает вывод в экспоненциальной форме.
После знака процента может размещаться флаг, позволяющий задать некоторые дополнительные параметры отображения чисел. Флаг может принимать следующие значения:
знак плюс, для отображения знака положительных чисел;
знак минус, означающий выравнивание числа по левому краю в отведенном для него поле (по умолчанию число выравнивается по правому краю);
цифра ноль, предназначенная для заполнения оставшихся позиций слева от числа нулями.
Команды, приведенные ниже, демонстрируют использование флага:
a = 0.56;
b = 1.1;
c = 1.22;
fprintf ( F , 'а =%+7.3f b = %- 11.1f с =%07.2f\n' , a, b, c);
Дополните ими файл-программу, приведенную в примере 2, и посмотрите результат:
а = +0.560 b = 1.1 с =0001.22
Полезной особенностью fprintf является то, что список ввода может быть матрицей. Матрица выводится по столбцам – с последовательным применением форматов из списка.
Команды
[F, mes] = fopen ( 'randmatr. txt' , 'w');
R = rand(3) ;
disp(R)
fprintf(F, '| %7.4f | %7.4f | %7.4f |\n', R');
fclose(F);
выводят квадратную матрицу R размера три на три из случайных чисел в командное окно и файл, столбцы в файле разделены вертикальными линиями
| 0.9649 | 0.9572 | 0.1419 |
| 0.1576 | 0.4854 | 0.4218 |
| 0.9706 | 0.8003 | 0.9157 |
Обратите внимание, что аргументом команды fprintf является транспонированная матрица R, т. к. fprintf работает с матрицей по столбцам. Матрица, отображенная в командном окне, совпадает с матрицей, записанной в файл randmatr.txt.
Информации о форматах, приведенной выше, вполне достаточно для завершения работы над файл-функцией sintable, предназначенной для вывода таблицы значения функции sin в файл. Операторы, осуществляющие запись в файл названия и шапки таблицы, приведены в примере 2. Часть файл-функции, отвечающая за вывод таблицы (разумеется, данный блок должен предшествовать закрытию файла функцией fclose)
% Cоздание вектора значений аргумента
x = 0:pi/2:2*pi;
% Конструирование матрицы, первая строка которой содержит
% значение аргумента, а вторая — значения функции sin
M = [x; sin(x)];
% форматный вывод элементов матрицы
fprintf(F, '|%7.3f|%10.4f|\n', M);
Задание 6.
Вставьте вышеприведенный блок операторов в файл-функцию sintable и вызовите ее, указав в качестве входного аргумента строку с именем файла table.dat. Покажите содержимое файла table.dat.
