Программирование DSP VisualDSP библиотека C runtime, fprintf Tue, October 08 2024  

Поделиться

Нашли опечатку?

Пожалуйста, сообщите об этом - просто выделите ошибочное слово или фразу и нажмите Shift Enter.

VisualDSP библиотека C runtime, fprintf Печать
Добавил(а) microsin   

Функция fprintf производит вывод в файловый поток stream с преобразованием выводимых чисел по указанной строке формата format. Прототип функции:

#include < stdio.h >
int fprintf(FILE *stream, const char *format, /*args*/ ...);

Специальная комбинация символов в строке format (начинающаяся на символ %) задает, каким образом аргументы args будут преобразованы в текст перед выдачей в поток stream.

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

Flag, флаг – опциональные символы, которые модифицируют значение преобразования.

Width, ширина – опциональное числовое значение (или *) которая задает минимальную ширину в символьных позициях (width) поля преобразования.

Precision, точность – опциональное числовое значение, которое задает минимальное количество появляющихся цифр.

Length, длина – опциональный модификатор, который задает размер аргумента.

Type, тип – символ, который задает тип прикладываемого преобразования.

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

Flag Влияние на выводимое поле
- Левое выравнивание результата в поле (преобразованный текст дополняется пробелами справа). По умолчанию, когда этот флаг не указан, выравнивание производится вправо (пробелы добавляются слева).
+ Преобразование числа со знаком (signed) производится всегда с указанием знака + или -. По умолчанию только отрицательные значения выводятся со знаком -.
пробел К результату добавляется префикс из пробела, если первый символ не знак -, и если также не указан флаг +.
# Результат преобразуется в альтернативную форму, в зависимости от типа преобразования:

o если значение не 0, то слева добавляется символ 0.
x если значение не 0, то слева добавляется 0x.
X если значение не 0, то слева добавляется 0X.
a e E f F всегда генерируется десятичная точка.
G работает так же, как E, за исключением того, что завершающие нули не удаляются.

Если поле width указано, то преобразуемое в текст значение дополняется пробелами до указанной ширины, если преобразованное значение содержит меньше символов, чем width. Обычно дополнение производится слева символами пробела (что удобно применять для выравнивания полей таблиц вправо), но может также применяться дополнение вправо, если указан флаг '-'. Флаг '0' может использоваться как альтернатива дополнению пробелами; см. описание этого поля флага выше. Width может быть также указано как '*', что показывает, что текущий аргумент выравнивание в вызове fprintf это число int, которое определяет значение для width. Если это значение отрицательное, то это интерпретируется как флаг '-', т. е. поле width будет положительное, но будет применяться выравнивание вправо.

Опциональное значение точности precision начинается с точки (.), за которой идет либо звездочка (*), или десятичная цифра. Звездочка (*) показывает, что precision задается целочисленным аргументом, предшествующим форматируемому аргументу. Если указана только точка, то подразумевается precision, равная 0. Значение точности precision дает разные эффекты, в зависимости от используемого поля спецификатора преобразования type:

• Для A точность задает количество цифр после десятичной токи. Если precision 0, и флаг # не задан, то не будет генерироваться десятичная точка.
• Для d, i, o, u, x, X точность задает минимальное количество появляющихся цифр, по умолчанию 1.
• Для f, F, E, e, k, K, r, R точность задает количество цифр после десятичной точки, значение по умолчанию 6. Если спецификатор # присутствует с нулевой precision, то десятичная точка не генерируется.
• Для g, G точность задает максимальное количество значащих цифр.
• Для s точность задает максимальное количество записываемых символов.

Модификатор длины данных length может опционально использоваться для того, чтобы задать размер аргумента. Модификаторы длины могут предшествовать только The спецификаторам преобразования d, i, o, u, x, X, k, K, r, R или n, если не детализированы другие спецификаторы преобразования.

Length Действие
h Этот аргумент должен интерпретироваться как short int, short fract или short accum.
hh Этот аргумент должен интерпретироваться как char или unsigned char.
j Этот аргумент должен интерпретироваться как intmax_t или uintmax_t.
l Этот аргумент должен интерпретироваться как long int, long fract или long accum.
ll Этот аргумент должен интерпретироваться как long long int.
L Этот аргумент должен интерпретироваться как long double. Этот модификатор длины должен предшестволвать одному из спецификаторов преобразования a, A, e, E, f, F, g или G. Обратите внимание, что этот модификатор длины работате только если выбрана опция компилятора -double-size-64. Если же выбрана опция компилятора -double-size-32, то преобразование не будет выполнено, и соответствующий аргумент будет израсходован.
t Этот аргумент должен интерпретироваться как ptrdiff_t.
z Этот аргумент должен интерпретироваться как size_t.

Обратите внимание, что спецификаторы размера hh, j, t и z, как описано в стандарте C99 (ISO/IEC 9899:1999), доступны только если выбрана опция -full-io компилятора.

Следующая таблица содержит описание допустимых спецификаторов преобразования, которые определяют тип прикладываемого преобразования:

Спецификатор Преобразование
a, A
Число с плавающей запятой.
c
Одиночный символ.
d, i
Целое число со знаком.
e, E
Научная форма представления числа (мантисса/экспонента).
f, F
Десятичное число с плавающей запятой.
g, G
Преобразует так же, как и e, E или f, F.
k
Аккумулятор со знаком (signed accum).
K
Аккумулятор без знака (unsigned accum).
n
Указатель на целое число со знаком (signed), где сохраняется количество записанных до сих пор символов. на момент появления командной последовательности, содержащей n.
o
Восьмеричное число без знака (octal).
p
Указатель на void.
r
Дробное число со знаком (signed fract).
R
Дробное число без знака (unsigned fract).
s
Строка символов.
u
Целое число без знака (unsigned).
x, X
Целое число без знака в шестнадцатеричном представлении.
%
Позволяет вывести на печать символ % без преобразования аргумента (т. е. для этого нужно указать символ процента дважды, %%).

Спецификатор преобразования a|A конвертирует число с плавающей запятой (floating-point) с использованием стиля [-]0xh.hhhhp±d, где перед точкой стоит одна шестнадцатеричная цифра. Спецификатор преобразования a|A всегда содержит минимум одну цифру для экспоненты.

Спецификатор преобразования e|E конвертирует число с плавающей запятой в экспоненциальный (научный) стиль [-]d.ddde±dd. Экспонента всегда содержит как минимум 2 цифры. Когда в спецификаторе маленькая e, то на выходе перед значением для экспоненты будет использоваться маленькая e, и наоборот, если в спецификаторе большая E, то на выходе в экспоненте будет стоять большая E.

Спецификатор преобразования f|F конвертирует число в вид с десятичной точкой [-]d.ddd.

Спецификатор преобразования g|G конвертирует число в текст так же, как и e|E или f|F, в зависимости от значения преобразуемого числа. Если экспонента преобразуемого значения меньше -4, или больше или равно precision, то будет использоваться преобразование как e|E, иначе будет использоваться преобразование как f|F.

Для всех спецификаторов преобразования a, A, e, E, f, F, g и G аргумент, который соответствует бесконечности, будет отображен как inf или INF, с регистром символов, как у спецификатора. Для спецификаторов a, A, e, E, f, F, g и G аргумент, который соответствует NaN, будет отображаться как nan или NAN, в зависимости от регистра спецификатора.

Спецификаторы преобразования k|K и r|R конвертируют значение с фиксированной точкой (fixed-point) в представление с десятичной точкой [-]d.ddd, когда Ваше приложение собрано с опцией компилятора -full-io или -fixed-point-io. Иначе k|K и r|R преобразуют значение fixed-point в шестнадцатеричную форму.

Возвращаемое значение. Функция fprintf вернет количество символов, выведенных на печать. Если произошла ошибка, то будет возвращено отрицательное значение.

Пример использования fprintf для вывода в поток stdout (фактически это обычно то же самое, что использовать функцию printf):

#include < stdio.h >
 
void fprintf_example(void)
{
   char *str = "hello world";
   /* Вывод в stdout строки "  +1  +1." */
   fprintf(stdout, "%+5.0f%+#5.0f\n", 1.234, 1.234);
  
   /* Вывод в stdout строки "1.234 1.234000 1.23400000" */
   fprintf(stdout, "%.3f %f %.8f\n", 1.234, 1.234, 1.234);
  
   /* Вывод в stdout строки "justified:                           left:5    right:    5" */
   fprintf(stdout, "justified:\nleft:%-5dright:%5i\n", 5, 5);
  
   /* Вывод в stdout строки      "90% of test programs print hello world" */
   fprintf(stdout, "90%% of test programs print %s\n", str);
  
   /* Вывод в stdout строки "0.0001 1e-05 100000 1E+06" */
   fprintf(stdout, "%g %g %G %G\n", 0.0001, 0.00001, 1e5, 1e6);
}

См. также описание функций printf, snprintf, vfprintf, vprintf, vsnprintf, vsprintf.

[Ссылки]

1. IAR EWB ARM: форматированный вывод printf библиотеки DLIB.
2. Секреты printf.
3. IAR EW ARM: как перенаправить вывод printf и putchar.
4. VisualDSP: ввод/вывод с использованием файлов (stdio).
5. Blackfin: форматированный вывод в окно терминала через UART.
6. Выравнивание в printf по правой стороне выводимого числа.
7. IAR EW ARM: DBGU, хитрости в использовании printf.

 

Добавить комментарий


Защитный код
Обновить

Top of Page