1.9. Форматный вывод данных
1.9.1. Форматные преобразования sprintf, sscanf.
Преобразование списка данных (a1, a2, …) по формату fmt с записью результата в строку s выполняется с помощью функции sprintf:
[s]=sprintf(fmt,a1,a2,...) |
Строка формата fmt задает формат преобразования, состоящий из спецификаций, начинающихся с символа % (процент), и набора литерных символов, переносимых безо всяких изменений из строки формата в результат.
Таблица 1.9.1. Краткие сведения о символах-спецификаторах.
Спецификатор |
Формат результата |
%c |
Единственный символ |
%d |
Целое десятичное число со знаком |
%e |
Вещественное число в форме с плавающей точкой (порядок идентифицирует буква «e») |
%E |
Вещественное число в форме с плавающей точкой (порядок идентифицирует буква «E») |
%f |
Вещественное число в форме с фиксированной точкой |
%g |
Компактная форма числа с фиксированной или плавающей точкой |
%G |
Компактная форма числа с фиксированной или плавающей точкой |
%s |
Строка символов |
%u |
Целое десятичное число без знака |
Спецификаторы %d и %u имеет смысл применять к целочисленным значениям, причем если соответствующий элемент списка не является целым числом, то MATLAB заменяет целочисленную спецификацию на формат вещественного числа.
Все символы, включенные в состав строки fmt и не относящиеся к форматным спецификациям, являются литералами, которые без изменения переносятся в результирующую строку. Среди литералов могут присутствовать управляющие символы, представленные в таблице 1.9.2, запись которых осуществляется согласно правилам языка программирования C.
Таблица 1.9.2. Краткие сведения об управляющих символах.
Символ |
Назначение |
\b |
Удаление предшествующего символа (Backspace) |
\f |
Перевод страницы (Form feed) |
\n |
Перевод строки (New line) |
\r |
Возврат каретки (Carriage return) |
\t |
Горизонтальная табуляция (Horizontal tab) |
\\ |
Обратная косая черта (Backslash) |
\'' |
Одинарная кавычка (') |
%% |
Процент (%) |
Приведем ниже несколько примеров форматного вывода данных в системе MATLAB (например, в режиме командной строки):
>> sprintf('%-7d %+7d %07d',12345,12345,12345) ans = 12345 +12345 0012345 >> sprintf('% d',12345) ans = 12345 >> sprintf('% d',-12345) ans = -12345 >> sprintf('%10.6f',pi) ans = 3.141593 >> sprintf('%9.5f',pi) ans = 3.14159 >> sprintf('%d',pi) ans = 3.141593e+00 >> sprintf('Число пи=%10.8f',pi) ans = Число пи=3.14159265 |
Обратная операция по извлечению данных из строки s, сформированной функцией sprintf, выполняется с помощью функции sscanf:
A=sscanf(s,fmt) |
Такой вариант вызова обеспечивает выборку всех данных и их обратное преобразование из символьного представления в машинное в соответствии с форматными указателями строки fmt. Форматные спецификации в данном случае те же самые, что и при преобразовании в строку.
Среди дополнительных средств управления форматом следует выделить перечисленные ниже:
– использование флажка, задаваемого символом «*», обеспечивающего пропуск очередного данного в строке s;
– использование форматов %hd, %ld и %lg, позволяющих преобразовать
извлекаемое число в машинный код короткого целого (%hd), длинного целого (%ld) или вещественного числа двойной точности (%lg);
– использование формата %[s1s2...], обеспечивающего извлечение только тех символов из строки s, которые перечислены в квадратных скобках;
– использование формата %[^s1s2...], обеспечивающего извлечение только тех символов из строки s, которые не перечислены в квадратных скобках.
Приведем характерный пример (например, в режиме командной строки):
>> s='2.7183 3.1416'; >> A=sscanf(s,'%f') A = 2.7183 3.1416 |
Заметим, что при прямом преобразовании в строку для массива A также требовалась лишь одна спецификация формата:
>> s1=sprintf('%f ',A) s1 = 2.718300 3.141600 |
Следует отметить использование литерального пробела в формате. Без него оба числовых значения оказались бы «склеенными», и для их разделения потребовались бы определенные усилия.
>> s1=sprintf('%f',A) s1 = 2.7183003.141600 |
