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, тип – символ, который задает тип прикладываемого преобразования. Символы флага могут идти в лютом порядке, и их появление не обязательно. Допустимые символы флагов описаны в следующей таблице.
Если поле width указано, то преобразуемое в текст значение дополняется пробелами до указанной ширины, если преобразованное значение содержит меньше символов, чем width. Обычно дополнение производится слева символами пробела (что удобно применять для выравнивания полей таблиц вправо), но может также применяться дополнение вправо, если указан флаг '-'. Флаг '0' может использоваться как альтернатива дополнению пробелами; см. описание этого поля флага выше. Width может быть также указано как '*', что показывает, что текущий аргумент выравнивание в вызове fprintf это число int, которое определяет значение для width. Если это значение отрицательное, то это интерпретируется как флаг '-', т. е. поле width будет положительное, но будет применяться выравнивание вправо. Опциональное значение точности precision начинается с точки (.), за которой идет либо звездочка (*), или десятичная цифра. Звездочка (*) показывает, что precision задается целочисленным аргументом, предшествующим форматируемому аргументу. Если указана только точка, то подразумевается precision, равная 0. Значение точности precision дает разные эффекты, в зависимости от используемого поля спецификатора преобразования type: • Для A точность задает количество цифр после десятичной токи. Если precision 0, и флаг # не задан, то не будет генерироваться десятичная точка. Модификатор длины данных length может опционально использоваться для того, чтобы задать размер аргумента. Модификаторы длины могут предшествовать только The спецификаторам преобразования d, i, o, u, x, X, k, K, r, R или n, если не детализированы другие спецификаторы преобразования.
Обратите внимание, что спецификаторы размера hh, j, t и z, как описано в стандарте C99 (ISO/IEC 9899:1999), доступны только если выбрана опция -full-io компилятора. Следующая таблица содержит описание допустимых спецификаторов преобразования, которые определяют тип прикладываемого преобразования:
Спецификатор преобразования 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. |