Домашняя страница библиотеки_c AVR

Синтаксис языка C

Библиотека языка C GNU glibc

 Страницы развития библиотеки_с AVR

Главная страница

Инструкция пользователя

Содержание библиотеки_c

Часто задаваемые вопросы

Содержание по алфавиту

Демонстрационные проекты

 

 

 

 

 

 


<stdio.h>: Стандартные средства ввода / вывода


Детальное Описание #include <stdio.h>

Введение в Стандартные средства ввода / вывода (IO)

Этот файл объявляет стандартные средства IO. Из-за характера используемого оборудования, в avr-libc осуществлено только ограниченное количество стандартных функций IO. Фактически доступного выполняемого файла нет, может быть обслужено только одно устройство IO. Так как операционная система отсутствует, приложение должно обеспечить достаточно много деталей об устройствах, чтобы сделать их пригодными для использования стандартными средствами IO.

Из-за пространственных ограничений, некоторые функции не были осуществлены вообще (например некоторые из преобразований printf). Также, пользователи должны быть предупреждены, что семейство функций printf и scanf, хотя обычно и связаны с простыми вещами, подобными всем известной программе "Hello, world!", фактически же являются довольно сложными, что приводит при их включении к съеданию достаточно большого пространства кода. Также, они - не быстры из-за характера интерпретации формата строки во время выполнения. Всякий раз, когда можно, следует прибегать (иногда не нормативно) к конверсионным средствам, которые предлагаются avr-libc, обычно это будет стоить много меньше в смысле скорости и размера кода.

Настраиваемые варианты - размер кода, против набора признаков

Чтобы позволить программистам, устанавливать размер кода в ущерб функциональным возможностям, функции vfprintf() которая является основой семейства printf, может быть выбрана в различных вариантах. Для подробностей смотрите документацию vfprintf(). То же самое относится к семейству функций vfscanf() и scanf.

Схема выбранного API

Стандартные потоки stdin, stdout, и stderr обеспечены, но вопреки C стандарту, так как avr-libc не имеет соответствующей информации о применимых устройствах, эти потоки не инициализируются при прикладном запуске. Также, так как в avr-libc вообще нет такого понятия как файл, нет и функции fopen() хотя она могла бы использоваться, чтобы связать поток с некоторым устройством.

Можно было осуществить абстракцию устройства, которое является совместимым с fopen() но так как это потребовало бы, анализировать строку, и брать всю необходимую информацию или из этой строки, или из дополнительной таблицы, которая должна была бы быть обеспечена приложением, этот подход не был предпринят.

Вместо этого, обеспечена функция fdevopen(), для связи потока с устройством, которое должно обеспечить функцию приёма  - передачи символа. В avr-libc нет дифференцирования между текстовым и бинарным потоками. Символ \n посылается непосредственно устройству функцией put(). Если устройство требует перевода каретки - символ (\r), который будет послан перед переводом строки, это должна осуществить подпрограмма put().

Это в основном следует за подходом Unix: если устройство типа терминала нуждается в специальной обработке, это находится в области оконечного драйвера устройства, чтобы обеспечить эти функциональные возможности. Таким образом, простая функция подходящая на put() для fdevopen() общающаяся с интерфейсом UART могла бы выглядеть так:

    int
    uart_putchar(char c, FILE *stream)
    {
 
      if (c == '\n')
        uart_putchar('\r');
      loop_until_bit_is_set(UCSRA, UDRE);
      UDR = c;
      return 0;
    }
Как альтернатива функции fdevopen(), может использоваться макрокоманда fdev_setup_stream() при установке обеспеченная пользователем структура FILE.

Следует отметить, что автоматическое преобразование символа newline в перевод каретки - newline нарушает последовательность двоичных передач. Если двоичные передачи желательны, не должно выполняться никакое автоматическое преобразование, но вместо этого никакая строка, которая нацеливает, последовательность CR-LF должна явно использовать "\r\n".

Для удобства, при первом запросе fdevopen() открывается поток для чтения, и заставит заканчивающийся поток быть aliased к stdin. Аналогично, при первом запросе fdevopen () открывается поток для записи, и заставит заканчивающийся поток быть aliased к обоим, stdout, и stderr. Таким образом, если открытие было сделано с обоими, с намерением чтения и записи, все три стандартных потока будут идентичны. Обратите внимание, что эти псевдонимы неразличимы друг от друга, таким образом, запрос fclose () на таком потоке также закроет все его псевдонимы. Это исполнение было выбрано, потому что стоимость поддержания псевдонима значительно меньше, чем стоимость поддержания полных копий каждого потока. Все же, обеспечивая выполнение, которое предлагает, законченный набор стандартных потоков, как считали, был полезным. Не только потому, что запись printf() вместо fprintf(mystream...) проще печатать, но так как avr-gcc должные к курорту передать все параметры функций variadic на стеке (в противоположность прохождению их в регистраторах для функций, которые берут установленный номер параметров), способность передать один параметр меньше, подразумевая stdin также сэкономит некоторое время выполнения

Можно связать дополнительные пользовательские данные с потоком, использованием fdev_set_udata(). Внутренний помещенный и добираются, функции могут тогда извлечь это пользовательское использование данных fdev_get_udata(), и действие соответственно. Например, могла использоваться единственная помещенная функция, чтобы общаться с двумя различными UART, которые тот путь, или помещенный и получать функции мог там сохранить внутренним состоянием между запросами.

Форматирование строки во flash ROM

Все функции семейства printf и scanf имеют два варианта: стандартное имя, когда строка формата, как ожидается, будет находиться в SRAM, а так же версия с суффиксом "_P", когда строка формата, как ожидается, постоянно находится во flash ROM. Макрокоманда PSTR (см. <avr/pgmspace.h>: Program Space Utilities) становится очень удобной для объявления формата строк.

Запуск stdio без malloc().

По умолчанию, fdevopen() требует malloc(). Поскольку для ограниченной среды микроконтроллера это часто не желательно, то обеспечена альтернативная опция для работы полностью без malloc().

Обеспечена макрокоманда fdev_setup_stream(), чтобы подготовить снабженный пользователем буфер FILE для действий с stdio.

Пример

    #include <stdio.h>
 
    static int uart_putchar(char c, FILE *stream);
 
    static FILE mystdout = FDEV_SETUP_STREAM(uart_putchar, NULL, _FDEV_SETUP_WRITE);
 
    static int
    uart_putchar(char c, FILE *stream)
    {
      if (c == '\n')
        uart_putchar('\r', stream);
      loop_until_bit_is_set(UCSRA, UDRE);
      UDR = c;
      return 0;
    }
 
    int
    main(void)
    {
      init_uart();
      stdout = &mystdout;
      printf("Hello, world!\n");
 
      return 0;
    }

Этот пример использует форму инициализии FDEV_SETUP_STREAM() вместо подобной функции fdev_setup_stream(), так что вся инициализация данных происходит в течение запуска C.

Если потоки, инициализировавшие этот путь больше не нужны, то они могут быть разрушены первым запросом макрокоманды fdev_close(), и затем следует разрушение непосредственно объекта. Запрос к fclose() не должен быть выпущен для этих потоков. При запросе fclose() непосредственно безопасен, он вызовет неопределенную ссылку к free() и таким образом заставляет компоновщик связывать модуль malloc в приложение.

Макроопределения

#define putc(__c, __stream)   fputc(__c, __stream)

Только псевдоним для int fputc (int __c, FILE *__stream). Передаёт символ c (хотя тип int) в stream. Возвращает символ, или EOF в случае ошибки.

#define getc(__stream)   fgetc(__stream)

Только псевдоним для int fgetc (FILE * __stream). Принимает символ из stream. Возвращает символ, или EOF в случае столкновения с концом файла, или ошибки. Для различения этих ситуаций нужно использовать функции feof() или ferror().

#define putchar(__c)   fputc(__c, stdout)

Предаёт символ c в stdout.

#define getchar()   fgetc(stdin)

Принимает символ из stdin. Возвращает символ, или EOF в случае столкновения с концом файла, или ошибки. Для различения этих ситуаций нужно использовать функции feof() или ferror().

#define FILE   struct __file

FILE является структурой, которую передают между различными стандартными функциями IO.

#define stdin   (__iob[0])

Входной поток для упрощенных функций, не берущих stream. Первый поток открытый для чтения fdevopen() будет назначен на stdin.

#define stdout   (__iob[1])

Входной поток для упрощенных функций, не берущих stream. . Первый поток открытый для чтения fdevopen() будет назначен на stdin, и stderr.

#define stderr   (__iob[2])

Поток для вывода ошибки. Если не назначено иначе, идентичен stdout. Если stderr должен указать на другой поток, результат другого fdevopen() должен быть явно назначен на него, не закрывая предыдущий stderr (иначе закроется и stdout).

#define EOF   (-1)

EOF объявляет значение, которое возвращается различными стандартными функциями IO в случае ошибки. Начиная с платформы AVR (в настоящее время) не содержит абстракцию для фактических файлов, ее начало координат, поскольку "конец файла" является здесь несколько бессмысленным.

#define _FDEV_ERR   (-1)

Возвращаемое значение конца файла, при чтении. Используется в функции fdevopen().

#define _FDEV_EOF   (-2)

Возвращаемое значение при возникновении ошибки, при чтении. Используется в функции fdevopen().

#define _FDEV_SETUP_READ   __SRD

fdev_setup_stream() с намерением чтения

#define _FDEV_SETUP_WRITE   __SWR

fdev_setup_stream() с намерением записи

#define _FDEV_SETUP_RW   (__SRD|__SWR)

fdev_setup_stream() с намерением чтения - записи

#define fdev_close()

Эта макрокоманда освобождает любые библиотечные ресурсы, которые могли бы быть связаны со stream. Вызывается если stream больше не нужен, прежде чем приложение собирается уничтожать непосредственно объект stream. (В настоящее время, эта макрокоманда не используется, но это может измениться в будущих версиях библиотеки.)

#define fdev_get_udata(stream)   ((stream)->udata)

Эта макрокоманда восстанавливает(находит) указатель на определяемые пользователем данные из объекта потока FILE.

#define fdev_set_udata(stream, u)   do { (stream)->udata = u; } while(0)

Эта макрокоманда вставляет указатель на определяемые пользователем данные в объект потока FILE. Пользовательские данные могут быть полезны для того, чтобы проследить состояние в помещенном и получить функции, поставляемые к функции fdevopen ().

#define fdev_setup_stream(stream, put, get, rwflag)

Установка обеспеченного пользователем буфера как потока stdio.   Эта макрокоманда берет обеспеченный пользователем буфер stream, и устанавливает его как поток, который является правильным для операций stdio, подобным тому, который был получен динамически от fdevopen (). Буфер установки должен иметь тип FILE.   Параметры put и get являются идентичными тем, что потребность, которая будет передана к fdevopen().   Параметр rwflag может взять одно из значений _FDEV_SETUP_READ, _FDEV_SETUP_WRITE, или _FDEV_SETUP_RW, для чтения, записи, или чтения - записи, соответственно.   Примечание: Никакие назначения на стандартные потоки не будут выполнены fdev_setup_stream(). Если стандартные потоки должны использоваться, они должны быть назначены пользователем.

#define FDEV_SETUP_STREAM(put, get, rwflag)

Инициализатор для обеспеченного пользователем потока stdio. Эта макрокоманда действует подобно fdev_setup_stream(), но должна использоваться как инициализатор переменную типа FILE. Параметры сохранения должны использоваться как объяснено в fdev_setup_stream().

 

Функции

int fgetc (FILE *__stream)

Принимает символ из stream. Возвращает символ, или EOF в случае столкновения с концом файла, или ошибки. Для различения этих ситуаций нужно использовать функции feof() или ferror().

int fputc (int __c, FILE *__stream)

Передаёт символ c (хотя тип int) в stream. Возвращает символ, или EOF в случае ошибки.

*************************************

********************************************************************************

int puts (const char *__str)

Записывает строку, на которую указывает str, и перемещает символ newline, в stdout. Функция puts () использует определение putchar () для посимвольного вывода строки в порт RS232, назначенный последним. Предположим, у нас есть определение строки, предназначенной для вывода через последовательный интерфейс: char s[6]   =   "12345"; Вызов функции puts () для вывода этой строки выглядит просто как puts(s).

int puts_P (const char *__str)

Вариант puts() но str постоянно находится в памяти программ

int fputs (const char *__str, FILE *__stream)

Передаёт строку, на которую указывают str в поток stream.   Возвращает 0 при успехе и EOF при ошибке.

int fputs_P (const char *__str, FILE *__stream)

Вариант fputs() но str постоянно находится в памяти программ.

*************************************

********************************************************************************

int vfprintf (FILE *__stream, const char *__fmt, va_list __ap)

Выполняет форматированный вывод в поток в stream. Подробности см. ниже.

vfprintf - центральное средством семейства функций printf. Она выводит отформатированные значения, с помощью fmt в stream. Фактические значения печатати передаются как переменный параметр list ap

vfprintf возвращает количество символов, записанных в stream, или EOF в случае ошибки. В настоящее время, это случится, только если stream был открыт не с целью записи.

Спецификации преобразования в строке шаблона имеют общую форму: % флаги ширины [. точность] тип преобразования

Формат строки состоит из нуля или большего количества директив: обычных символов (не %), которые копируются в выходной поток - как есть, и спецификаторов форматирования, каждый из которых приводит к нулю выборки или большему количеству последующих параметров. Каждый спецификатор форматирования начинается с символа %. Параметры должны должным образом соответствовать спецификатору форматирования. После знака %, в последовательности следует:

  • Нуль или большее количество символов флага, которые изменяют нормальное поведение спецификации преобразования:
    • # Значение должно быть преобразовано в "дополнительную форму". Для c, d, i, s, и u преобразований, эта опция не эффективна. Для o преобразований, точность номера увеличена, чтобы вызвать первый символ строки вывода к нулю (кроме того, если нулевое значение напечатано с явной точностью нуля). Для x и X преобразований, ненулевой результат имеет строку `0x' (или `0X' для X преобразования) предшествовавший этому.
    • 0 (нуль) дополнение нулями. Для всех преобразований, преобразованное значение дополняется нулями с слева, а не пробелами. Если точность даётся с числовым преобразованием (d, i, o, u, i, x, и X), флаг 0 игнорируется.
    • - Отрицательный флаг ширины поля; преобразованное значение нужно оставить откорректированным на полевой границе. Преобразованное значение дополняется пробелами справа, а не с слева пробелами или нулями. A - отмены 0 если даются оба.
    • ' ' (пробел) Пробел нужно оставить перед положительным номером, произведенным преобразованием со знаком (d, или i).
    • + знак, всегда должен помещаться перед числом, произведенным преобразованием со знаком. Отмены + пробел, если оба используются.
  • Десятичное целое число, определяющее минимальную ширину поля. Если нормальное преобразование производит меньшее количество символов чем ширина поля, то оно дополняется пробелами слева до заданной ширины (или справа, если установлен флаг левой настройки).
  • Дополнительная точность, в форме периода . сопровождаемый дополнительной цифровой строкой. Если цифровая строка опущена, точность взята как нуль. Это дает минимальный номер цифр, чтобы появиться для преобразований d, i, o, u, x, и X, или максимальное число символов, которое будет напечатано от строки для s преобразования.
  • Дополнительный l или h модификатор длины, это определяет что параметр для преобразования d, i, o, u, x, или X является "long int" вместо inth игнорируется, как "short int" является эквивалентным int.
  • Символ, который определяет тип преобразования, которое будет применено.

Спецификаторы и их значения:

  • diouxX Параметр int (или соответствующий вариант) преобразован в десятичное число со знаком (d и i), восьмеричный без знака (o), десятичный без знака (u), или шестнадцатеричный без знака (x и X) примечание. Символы "abcdef" используются для x преобразований; символы "ABCDEF" используются для X преобразований. Точность, если таковые вообще имеются, дает минимальный номер цифр, которые должны появиться; если преобразованное значение требует меньшего количества цифр, дополняется нулями слева.
  • p Параметр void * взят как целое число без знака, и преобразован подобно как сделала бы команда %#x.
  • c Параметр int преобразован в "unsigned char", и символ окончания написан.
  • s Параметр "char * " как ожидается, будет указателем на массив символьного типа (указатель на строку). Символы от массива написаны до (но не, включая) закончившийся символ NUL; если точность определена, не больше, чем номер указанный написан. Если точность дается, никакая потребность нулевого символа не присутствует; если точность не определена, или больше чем размер массива, массив должен содержать закончившийся символ NUL.
  • % A % написан. Никакой параметр не преобразован. Законченная конверсионная спецификация "%%".
  • eE Двойной параметр округлен и преобразован(конвертирован) в формате "[-]d.ddde±dd" где есть одна цифра перед символом десятичной точки и номером цифр после того, как это равно точности; если точность отсутствует, это взято, как 6; если точность является нулевой, никакой символ десятичной точки не появляется. E преобразование использует символ 'E' (а не 'e') вводить экспоненту. Экспонента всегда содержит две цифры; если значение является нулевым, экспонента - 00.
  • fF Двойной параметр округлен и преобразованное в представление десятичных чисел в формате "[-]ddd.ddd", где номер цифр после символа десятичной точки равен спецификации точности. Если точность отсутствует, это взято, как 6; если точность является явно нулевой, никакой символ десятичной точки не появляется. Если десятичная точка появляется, не менее одна цифра появляется прежде, чем это.
  • gG Двойной параметр преобразован(конвертирован) в стиле f или e (или F или E для Г преобразования). Точность определяет номер значащих цифр. Если точность отсутствует, 6 цифр даются; если точность является нулевой, это обработано как 1. Стиль e используется, если экспонента от ее преобразования меньше чем-4 или больше чем или равна точности. Конечные нули удалены из дробной части результата; десятичная точка появляется, только если это сопровождается не менее одной цифрой.
  • S Подобен формату s, кроме указателя, как ожидается, укажет на память программ (ROM) строка вместо строки в RAM.

Ни в каком случае делает несуществующая или маленькая ширина поля вызывает усечение числового поля; если результат преобразования шире чем ширина поля, поле расширено, чтобы содержать конверсионный результат.

Так как полное выполнение всех упомянутых особенностей становится довольно большим, vfprintf() может быть выбран в трёх разных вариантах. По умолчанию vfprintf() справляется со всеми упомянутыми функциями, кроме преобразований с плавающей точкой. Доступна свернутая версия vfprintf(), которая осуществляет только основные целочисленные и строковые конверсионные средства, может быть определена только  дополнительная опция #, используя конверсионные флаги (эти флаги анализируются правильно от спецификации формата, но просто игнорируются). Эту версию можно требовать, используя следующие опции компилятора:

   -Wl,-u,vfprintf -lprintf_min

Если требуются полные функциональные возможности, включая преобразования с плавающей то, должны использоваться:следующие варианты

   -Wl,-u,vfprintf

-lprintf_flt -lm

Ограничения:

·        Указанная ширина и точность могут быть не более 255.

Примечания:

·        Для преобразований с плавающей точкой, если Вы связываете заданную по умолчанию или свернутую версию vfprintf(), символ? выведется и двойной параметр будет skiped. Так что Вы выводите, ниже не будет разбит. Для заданной по умолчанию версии поле ширины и "клавиатура к левый" (символ минус) опция будет работать в этом случае.

·         Модификатор длины hh игнорируется (символ параметр - promouted к int). Более точно, эта реализация не проверяет номер символы h.

·        Но ll модификатор длины будет, чтобы прервать вывод, поскольку эта реализация не работает long long параметры.

Переменная ширина или поле точности (звездочка * символ) не понят(не реализован), и будет, чтобы прервать вывод.

int vfprintf_P (FILE *__stream, const char *__fmt, va_list __ap)

Вариант vfprintf() использует fmt строки постоянно находящийся в памяти программ.

int printf (const char *__fmt,...)

Выполняет форматированный вывод в поток stderr. См. для подробностей vfprintf ().

int printf_P (const char *__fmt,...)

Вариант printf() использует fmt строки постоянно находящийся в памяти программ.

int vprintf (const char *__fmt, va_list __ap)

Функция vprintf исполняет отформатированный вывод в поток stdout, использует переменный список параметров, как vfprintf().

int sprintf (char *__s, const char *__fmt,...)

Вариант printf(), посылает отформатированные символы строке s.

int sprintf_P (char *__s, const char *__fmt,...)

Вариант sprintf()использует fmt строки постоянно находящийся в памяти программ.

int snprintf (char *__s, size_t __n, const char *__fmt,...)

Подобна sprintf(), но вместо принятия(предположения) s иметь бесконечный размер, не больше, чем n символы (включая конечный символ NUL) будут преобразованы в s. Возвращает число символов, которое было бы записано в s если было достаточно пространства.

int snprintf_P (char *__s, size_t __n, const char *__fmt,...)

Вариант snprintf()использует fmt строки постоянно находящийся в памяти программ.

int vsprintf (char *__s, const char *__fmt, va_list ap)

Подобна sprintf() но берет переменный список параметров.

int vsprintf_P (char *__s, const char *__fmt, va_list ap)

Вариант vsprintf()использует fmt строки постоянно находящийся в памяти программ.

int vsnprintf (char *__s, size_t __n, const char *__fmt, va_list ap)

Подобна vsprintf(), но вместо принятия(предположения) s иметь бесконечный размер, не больше символы, чем n (включение перемещения символ NUL) будет преобразован в s. Возвращает число символов, которое было бы записано в s если было достаточно пространства.

int vsnprintf_P (char *__s, size_t __n, const char *__fmt, va_list ap)

Вариант vsnprintf()использует fmt строки постоянно находящийся в памяти программ.

int fprintf (FILE *__stream, const char *__fmt,...)

Выполняет отформатированный вывод в stream. См. для подробностей vfprintf().

int fprintf_P (FILE *__stream, const char *__fmt,...)

Вариант fprintf()использует fmt строки постоянно находящийся в памяти программ.

*************************************

********************************************************************************

char * fgets (char *__str, int __size, FILE *__stream)

Читает не более size - 1 байт из stream, пока с newline символом не сталкивались, и память символы в буфере, на который указывают str. Если с ошибкой не сталкивались при чтении, строка будет тогда закончена с символ NUL.      При возникновении ошибки функция возвращает NULL и наборы флаг ошибки stream, который может быть проверен, используя ferror(). Иначе возвращается указатель на строку.

char * gets (char *__str)

Подобныа fgets() за исключением того, что это оперирует с потоком stdin, и перемещение newline (если любой) не будет сохранен в строке. Это - ответственность вызывающей программы обеспечить достаточную память, чтобы держать чтение символов.

*************************************

********************************************************************************

int vfscanf (FILE *__stream, const char *__fmt, va_list __ap)

Отформатированный ввод. Подробности см. ниже.

Отформатированный ввод. Эта функция - основа семейства функций scanf.

Символы читаются из stream и обрабатывается в пути, описанном fmt. Конверсионные результаты будут назначены на параметры, прошел via ap.

Формат строки fmt просмотрен для конверсионных спецификаций. Что - нибудь, что не включает конверсионную спецификацию, принято как текст, который согласован буквально против ввода. Незаполненное пространство в строке формата будет соответствовать любому незаполненному пространству в данных (не включая ни один), все другие символы соответствуют только непосредственно. Обработка прервана, как только данные и строка формата больше не соответствуют, или есть ошибка или состояние конца файла на stream.

Большинство пропуска преобразований, ведущего незаполненное пространство перед стартом фактического преобразования.

Преобразования начаты с символа %. За % могут следовать разные варианты:

  • * указывает, что преобразование должно быть выполнено, но конверсионный результат, должен быть отвергнут; никакие параметры не будут обработаны из ap,
  • h указывает, что параметр является указателем на short int (вместо int),
  • hh указывают, что параметр является указателем на char (rather than int).
  • l указывает, что параметр является указателем на long int (скорее than int, для преобразований целочисленных типов), или указатель на double (для преобразований с плавающей точкой),

Кроме того, максимальная ширина поля может быть определена как положительное десятичное целое число отличное от нуля, который ограничит преобразование в большинство это много символов от входного потока. Эта ширина поля ограничена не более 255 символами, которое также является значением по умолчанию (если бы не c преобразование, что значения по умолчанию к 1).

Следующие конверсионные флаги поддерживаются:

  • % Соответствует буквальному символу %. Это - не преобразование.
  • d Пары произвольно десятичное целое число со знаком; прямой указатель должен быть указателем на int.
  • i Пары произвольно целое число со знаком; прямой указатель должен быть указателем на int. Целое число читается в ядре 16, если это начинается 0x или 0X, в ядре 8, если это начинается 0, и в ядре 10 иначе. Только символы, которые соответствуют ядру, используются.
  • o Соответствует восьмеричному целому числу; прямой указатель должен быть указателем на int без знака.
  • u Соответствует произвольно десятичному целому числу со знаком; прямой указатель должен быть указателем на unsigned int.
  • x Соответствует произвольно шестнадцатеричному целому числу со знаком; прямой указатель должен быть указателем на int без знака.
  • f Соответствует произвольно числу с плавающей запятой со знаком; прямой указатель должен быть указателем на float.
  • e, g, F, E, G Эквивалент f.
  • s Соответствует последовательности символов ненезаполненного пространства; прямой указатель должен быть указателем на char, и   массив должен быть большой достаточно к ввод все   последовательность и   завершение символ NUL. Входная строка останавливается в незаполненном пространстве или в максимальной ширине поля, какой бы ни происходит сначала.
  • c Соответствует последовательности символов счета ширины (значение по умолчанию 1); прямой указатель должен быть указателем на char, и должен быть достаточный участок памяти для всех символов (никакое завершение NUL добавляется). Обычный пропуск продвижения незаполненного пространства подавлен. Чтобы пропускать незаполненное пространство сначала, используйте в формате явное пространство.
  • [ Соответствует непустой последовательности символов от указанного набора принятых символов; прямой указатель должен быть указателем на char, и должен быть достаточный участок памяти для всех символов в строке, плюс завершение NUL символ. Обычный пропуск продвижения незаполненного пространства подавлен. Строка должна быть составлена из символов в (или не в) определенный набор; набор определен символами между открытой скобкой [символ и близкая скобка] символ. Набор исключает те символы, если первый символ после открытой скобки - циркумфлекс ^. Чтобы включать близкую скобку в набор, делайте это первым символом после открытой скобки или циркумфлекса; любая другая позиция закончит набор. Символ дефиса - является также специальным; когда помещено между двумя другими символами, это добавляет все прошедшие символы к набору. Чтобы включать дефис, делайте это последним символом перед конечной(заключительной) близкой скобкой. Например, [^] 0-9-] означает набор все кроме близкой скобки, обнулите до девять, и дефис. Строка заканчивается появлением(видом) символа не в (или, с циркумфлексом, в) набор или когда ширина поля выполняется. Обратите внимание, что использование этого преобразования увеличивает расход стека.
  • p Соответствует значению указателя (как напечатано p в printf ()); прямой указатель должен быть указателем на пусто.
  • n Ничто не ожидается; вместо этого, число символов, использованное к настоящему времени от ввода сохранено через прямой указатель, который должен быть указателем на int. Это - не преобразование, хотя это может быть подавлено с * флажок.

Эти функции возвращают номер входных назначенных элементов(пунктов), которые могут быть меньше чем обеспеченный для, или даже обнулять, в случае отказа(неудачи) соответствия. Нуль указывает, что, в то время как был доступный ввод, никакие преобразования не были назначены; типично это происходит из-за недопустимого входного символа, типа алфавитного символа для a d преобразование. Значение Конец файла возвращен, если входной отказ(неудача) происходит прежде, чем любое преобразование типа конца файла происходит. Если ошибка или конец файла происходят после того, как преобразование началось, номер преобразований, которые были успешно закончены, возвращен.

По умолчанию, все преобразования, описанные выше доступны кроме преобразований с плавающей точкой, и ширина ограничена 255 символами. Преобразование пункта(точки) с плавающей точкой будет доступно в расширенной(продленной) версии, обеспеченной библиотекой libscanf_flt.a. Также в этом случае(регистре) ширина не ограничена (точно, это ограничено 65535 символами). Чтобы связать программу против расширенной(продленной) версии, используйте следующие флажки компилятора в стадии связи(ссылки):

     -Wl,-u,vfscanf -lscanf_flt -lm

Третья версия доступна для сред, которые являются плотными(напряженными) на пространстве(пробеле). В дополнение к ограничениям стандартного, эта версия осуществляет нет % [ спецификация. Эта версия обеспечена в библиотеке libscanf_min.a, и можно требовать, используя следующие варианты в стадии связи(ссылки):

     -Wl,-u,vfscanf -lscanf_min –lm

int vfscanf_P (FILE *__stream, const char *__fmt, va_list __ap)

Вариант vfscanf() использование строки fmt в памяти программ.

int scanf (const char *__fmt,...)

The function scanf performs formatted input from stream stdin. See vfscanf() for details.

int scanf_P (const char *__fmt,...)

Variant of scanf() where fmt resides in program memory.

int fscanf (FILE *__stream, const char *__fmt,...)

The function fscanf performs formatted input, reading the input data from stream. See vfscanf() for details.

int fscanf_P (FILE *__stream, const char *__fmt,...)

Variant of fscanf() using a fmt string in program memory.

int vscanf (const char *__fmt, va_list __ap)

Функция vscanf исполняет отформатированный ввод от потока stdin, взятие переменного списка параметров как в vfscanf(). См. vfscanf() для подробностей.

int sscanf (const char *__buf, const char *__fmt,...)

The function sscanf performs formatted input, reading the input data from the buffer pointed to by buf. See vfscanf() for details

int sscanf_P (const char *__buf, const char *__fmt,...)

Variant of sscanf() using a fmt string in program memory.

 

 

FILE * fdevopen (int(*put)(char, FILE *), int(*get)(FILE *))

функция - замена для fopen().Подробности см. ниже.

Эта функция - замена для fopen().

Это открывает поток для устройства, где фактическое выполнение устройства должно быть обеспечено приложением. Если успешно, указатель на структуру для открытого потока возвращен. Причины для возможного отказа(неудачи) в настоящее время не включают это ни один помещенный ни доберитесь параметр был обеспечен, таким образом пытаясь открыть поток без намерения IO вообще, или что недостаточная динамическая память является доступной, чтобы установить новый поток.

Если помещенный указатель функции обеспечен, поток открыт с намерением записи. Функция прошла как помещенный взял бы два параметра, первый символ, чтобы записать на устройство, и второй указатель на FILE, и должен возвратиться 0, если вывод был успешен, и значение отличное от нуля, если символ нельзя было бы послать устройству.

Если доберитесь указатель функции обеспечен, поток открыт с намерением чтения. Функция прошла как доберитесь должен взять указатель на FILE как его единственный(отдельный) параметр, и возвратить один символ из устройства, прошел как тип int. Если ошибка происходит при попытке читать от устройства, это должно возвратиться _FDEV_ERR. Если условие(состояние) конца файла было достигнуто при чтении от устройства, _FDEV_EOF будет возвращен.

Если обе функции обеспечены, поток открыт с чтением и записывать намерение.

Первый поток открылся с намерением чтения, назначен на stdin, и первый открылся с намерением записи, назначен на оба, stdout и stderr.

fdevopen() использetn calloc() (und таким образом malloc()) чтобы распределять память для нового потока.

Примечание:

Если макрокоманда __STDIO_FDEVOPEN_COMPAT_12 объявлен прежде, чем включение <stdio.h>, функциональный прототип для fdevopen () будет выбран, что является назад совместимым с avr-libc версией 1.2 и прежде. Это - исключительно intented для того, чтобы обеспечить простой путь перемещения без потребности немедленно заменить все исходный текст. Не используйте для нового кода.

int fclose (FILE *__stream)

Функция закрытия stream, и отвергает дальнейший IO от и к этому.     При использовании fdevopen() при установке потока, запрос к fclose() необходим чтобы к свободному внутренние распределенные ресурсы.     Если поток был установлен, используя fdev_setup_stream() или FDEV_SETUP_STREAM(), используйте fdev_close ().     В настоящее время всегда возвращается 0 (для успеха).

int  feof (FILE *__stream)

Проверяет флаг конца файла stream. Этот флаг может быть очищен только запросом clearerr().

int ferror (FILE *__stream)

Проверяет флаг ошибки stream. Этот флаг может быть очищен только запросом clearerr().

int ungetc (int __c, FILE *__stream)

Функция ungetc() помещает символ c (преобразовал в символ без знака) назад на входной поток, на который указывают stream. Назад помещенный символ будет возвращен последующим чтением на потоке.     В настоящее время, только один единственный символ может быть пододвинут обратно на поток.     Функция ungetc() возвращает символ, пододвинутый обратно после преобразования, или EOF при сбое операции. Если значение параметра символ c равняется EOF, операция будет терпеть неудачу, и поток останется неизменным

int fflush (FILE *stream)

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

void clearerr (FILE *__stream)

Очищает ошибку и флаги конца файла stream.

size_t  fwrite (const void *__ptr, size_t __size, size_t __nmemb, FILE *__stream)

Записывает объекты nmemb, size байт каждый, в stream. Первым байтом первого объекта ссылаются ptr.     Возвращает количество успешно переданных объектов, т.e. nmemb если не произошла ошибка вывода

size_t  fread (void *__ptr, size_t __size, size_t __nmemb, FILE *__stream)

Чтение объектов nmemb, size байт каждый, из stream в буфер, на который указывают ptr.     Возвращает количество успешно прчитанных объектов, т. e. nmemb если не произошла входная ошибка, и не сталкивались с концом файла. Должен использоваться feof () и ferror (), чтобы различить эти два состояния.

 

Hosted by uCoz