stdio.h

stdio.h (от англ. standard input/output header — стандартный заголовочный файл ввода-вывода) — заголовочный файл стандартной библиотеки языка Си, содержащий определения макросов, константы и объявления функций и типов, используемых для различных операций стандартного ввода и вывода. Функциональность унаследована от «портативного пакета ввода-вывода» («portable I/O package»), написанного Майком Леском из Bell Labs в начале 1970-х.[1] C++ ради совместимости также использует stdio.h наряду со схожим по функциональности заголовочным файлом cstdio.

Функции, объявленные в stdio.h, являются весьма популярными благодаря тому, что, являясь частью Стандартной библиотеки языка Си, они гарантируют работу на любой платформе, поддерживающей Си. Приложения на отдельных платформах могут, тем не менее, иметь причины для использования функций ввода-вывода самой платформы вместо функций stdio.h.

Стандарт определяет такое понятие, как поток — последовательный набор информации, который может быть входным или выходным, может быть предоставлен как файлом, так и устройством (например, терминалом)[2]. Поток может быть текстовым или бинарным. Текстовый поток — последовательность символов. При этом термин «символ» в данном контексте может означать как читаемый символ, так и управляющий символ (например, символ вертикальной табуляции или символ конца файла). Символы в текстовом потоке объединяются в строки. Каждая строка заканчивается символом новой строки либо символом конца файла. Бинарный поток — последовательность байтов, которые могут прозрачно представлять любую информацию (в том числе и текст). Поток может быть в одном из трёх состояний: неориентированном (по умолчанию), «широко символьном» или битовым. Состояние определяется последней функцией, которая использовала этот поток.

Пример использования

править

Все функции в языке Си (и его многочисленных разновидностях) объявляются в заголовочных файлах. Таким образом, программистам приходится подключать файл stdio.h к исходному коду, чтобы использовать функции, объявленные в нём.

#include <stdio.h>
 
int main(void)
{
    int ch;
    while ((ch = getchar()) != EOF)
        putchar(ch);
    putchar('\n');
    return 0;
}

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

Функции

править

Функции, объявленные в stdio.h, в общем случае могут быть разделены на две категории: функции для операций с файлами и функции для операций ввода-вывода.

Имя Примечания
Функции для файловых операций
fclose закрывает файл, ассоциированный с переданным ей значением FILE *
fopen, freopen, fdopen открывают файл для определённых типов чтения и записи
remove удаляет файл (стирая его)
rename переименовывает файл
rewind работает аналогично fseek (stream, 0L, SEEK_SET), вызванному для потока, со сбросом индикатора ошибок
tmpfile создает и открывает временный файл, удаляемый при закрытии через fclose()
Функции для операций ввода-вывода
clearerr очищает EOF и индикаторы ошибок для данного потока
feof проверяет, установлен ли индикатор EOF для данного потока
ferror проверяет, установлен ли индикатор ошибок для данного потока
fflush принудительно записывает вывод, предназначенный для помещения в буфер, в файл, ассоциированный с данным потоком
fgetpos сохраняет позицию указателя файла потока, ассоциированный с его первым аргументом (FILE *), в его второй аргумент (fpos_t *)
fgetc возвращает один символ из файла
fgets получает строку (оканчивающуюся символом перевода строки или конца файла) из потока (например файла или stdin)
fputc записывает один символ в поток
fputs записывает строку в поток
ftell возвращает указатель позиции файла, который может быть передан fseek
fseek производит смещение от текущей позиции в файле на указанное количество байт, или от его начала или конца, в указанном направлении.
fsetpos устанавливает указатель позиции файла потока, ассоциированный с его первым аргументом (FILE *), как хранимый во втором его аргументе (fpos_t *)
fread читает данные из файла
fwrite записывает данные в файл
getc считывает и возвращает символ из данного потока и изменяет указатель позиции файла; позволяет использоваться как макрос с теми же эффектами, что и fgetc, кроме того, что может вычислять поток более одного раза
getchar имеет аналогичный эффект, что и getc(stdin)
gets считывает символы из stdin до символа перевода строки и хранит их в своём единственном аргументе (очень опасная из-за переполнения буфера)
printf, vprintf используются для вывода в стандартный поток вывода
fprintf, vfprintf используются для вывода в файл
sprintf, snprintf, vsprintf используются для вывода в массив типа char (Строка в языке Си)
perror записывает сообщение об ошибке в stderr
putc записывает и возвращает символ в поток и изменяет указатель позиции файла на него; можно использовать как макрос с теми же свойствами, что и fputc, кроме того, что он может обрабатывать поток более одного раза
putchar, fputchar аналогичны putc(stdout)
scanf, vscanf используются для ввода из стандартного потока ввода
fscanf, vfscanf используются для ввода из файла
sscanf, vsscanf используются для ввода из массива char (то есть Строка в языке Си)
setbuf указывает буфер, который будет использоваться ука­занным потоком
setvbuf устанавливает режим буферизации для данного потока
tmpnam создает имя временного файла
ungetc помещает символ обратно в поток
puts выводит символьную строку в stdout

Константы

править

В заголовочном файле stdio.h определены следующие константы:

Имя Примечания
EOF отрицательное целое число типа int, используемое для обозначения конца файла
BUFSIZ целое число, равное размеру буфера, используемое функцией setbuf()
FILENAME_MAX размер массива char, достаточного для хранения имени любого файла, который может быть открыт
FOPEN_MAX число файлов, которые могут быть открыты одновременно; как минимум равно 8
_IOFBF сокращение от «input/output fully buffered» (полностью буферируемый ввод-вывод); целое число, которое может быть передано функции setvbuf() для запроса блока буфера ввода и вывода для открытого потока
_IOLBF сокращение от «input/output line buffered» (линейно буферируемый ввод-вывод); целое число, которое может быть передано функции setvbuf() для запроса линии буфера ввода и вывода для открытого потока
_IONBF сокращение от «input/output not buffered» (не буферируемый ввод-вывод); целое число, которое может быть передано функции setvbuf() для запроса небуферированого ввода и вывода для открытого потока
L_tmpnam размер массива char, достаточного для хранения временного имени файла, сгенерированного функцией tmpnam()
NULL макрос, расширяющий константу нулевого указателя; то есть константу, представляющую значение указателя, гарантированно указывающего несуществующий адрес объекта в памяти
SEEK_CUR целое число, которое может быть передано функции fseek() для запроса позиционирования относительно текущей позиции в файле
SEEK_END целое число, которое может быть передано функции fseek() для запроса позиционирования относительно конца файла
SEEK_SET целое число, которое может быть передано функции fseek() для запроса позиционирования относительно начала файла
TMP_MAX максимальное число уникальных имён файлов, генерируемых функцией tmpnam(); как минимум 25

Переменные

править

Следующие переменные определены в заголовочном файле stdio.h:

Имя Примечания
stdin указатель на FILE, указывающий на стандартный поток ввода (обычно клавиатура).
stdout указатель на FILE, указывающий на стандартный поток вывода (обычно дисплей терминала).
stderr указатель на FILE, указывающий на стандартный поток ошибок (обычно дисплей терминала).

Типы данных, определённые в заголовочном файле stdio.h, содержат:

  • FILE — структура, содержащая информацию о файле или текстовом потоке, необходимую для выполнения её операций ввода и вывода операций, включая:
    • файловый дескриптор
    • текущую позицию в потоке
    • индикатор конца файла
    • индикатор ошибок
    • указатель на буфер потока, если возможно
  • fpos_t — не массивообразный тип, способный уникально идентифицировать позицию каждого байта в файле.
  • size_t — беззаконный целый тип, являющийся типом результата выполнения оператора sizeof.

Примечания

править
  1. Kernighan, Brian[англ.]; Роб Пайк. The UNIX Programming Environment[англ.] (неопр.). — Энглвуд-Клифс[англ.]: Prentice Hall, 1984. — С. pg. 200.
  2. ISO/IEC 9899:1999. Дата обращения: 7 августа 2011. Архивировано 22 августа 2011 года.

Ссылки

править