Стандартная библиотека C (libc) |
---|
Общие темы |
Разные заголовки |
|
Язык программирования C предоставляет множество стандартных библиотечных функций для ввода и вывода файлов . Эти функции составляют большую часть заголовка стандартной библиотеки C < stdio.h > . [1] Функциональность происходит от «переносимого пакета ввода/вывода», написанного Майком Леском в Bell Labs в начале 1970-х годов, [2] и официально ставшего частью операционной системы Unix в версии 7 . [3]
Функциональность ввода-вывода в C довольно низкоуровневая по современным стандартам; C абстрагирует все файловые операции в операции над потоками байтов , которые могут быть «входными потоками» или «выходными потоками». В отличие от некоторых более ранних языков программирования, C не имеет прямой поддержки файлов данных с произвольным доступом ; чтобы прочитать запись в середине файла, программист должен создать поток, перейти к середине файла, а затем последовательно прочитать байты из потока.
Потоковая модель файлового ввода-вывода была популяризирована Unix, которая была разработана одновременно с самим языком программирования C. Подавляющее большинство современных операционных систем унаследовали потоки от Unix, и многие языки семейства языков программирования C унаследовали интерфейс файлового ввода-вывода C с небольшими изменениями, если таковые вообще имелись (например, PHP ).
Эта библиотека использует так называемые потоки для работы с физическими устройствами, такими как клавиатуры, принтеры, терминалы или с любым другим типом файлов, поддерживаемым системой. Потоки — это абстракция для взаимодействия с ними единообразно. Все потоки имеют схожие свойства независимо от индивидуальных характеристик физических носителей, с которыми они связаны. [4]
Большинство функций ввода/вывода C-файла определены в <stdio.h> (или в заголовочном файле C++ cstdio , который содержит стандартную функциональность C, но в пространстве имен std ).
Байтовый символ | Широкий характер | Описание | |
---|---|---|---|
Доступ к файлам | fopen | Открывает файл (с именем файла, отличным от Unicode, в Windows и возможным именем файла UTF-8 в Linux) | |
свободно | Открывает другой файл с существующим потоком | ||
fflush | Синхронизирует выходной поток с реальным файлом. | ||
fclose | Закрывает файл | ||
setbuf | Устанавливает буфер для потока файлов | ||
setvbuf | Устанавливает буфер и его размер для потока файлов | ||
fwide | Переключает файловый поток между широкосимвольным и узкосимвольным вводом-выводом | ||
Прямой ввод/вывод | ужас | Читает из файла | |
fwrite | Записывает в файл | ||
Неформатированный ввод/вывод | fgetc получитьc | fgetwc getwc | Считывает byte/ wchar_t из файлового потока |
fgets | fgetws | Считывает строку byte/ wchar_t из потока файла | |
fputc путc | fputwc putwc | Записывает byte/ wchar_t в файловый поток | |
fputs | fputws | Записывает строку byte/ wchar_t в файловый поток | |
получитьчар | getwchar | Считывает byte/ wchar_t из stdin | |
— | Считывает строку байтов из stdin до тех пор, пока не встретится новая строка или конец файла (устарело в C99, удалено из C11) | ||
путчар | putwchar | Записывает byte/ wchar_t в stdout | |
ставит | — | Записывает строку байтов в stdout | |
ungetc | ungetwc | Помещает byte/ wchar_t обратно в файловый поток | |
Форматированный ввод/вывод | scanf fscanf sscanf | wscanf fwscanf swscanf | Считывает форматированный байтовый/ wchar_t ввод из stdin, файлового потока или буфера |
vscanf vfscanf vsscanf | vwscanf vfwscanf vswscanf | Считывает форматированный входной байт/ wchar_t из stdin, файлового потока или буфера, используя переменный список аргументов | |
printf fprintf sprintf snprintf | wprintf fwprintf swprintf | Выводит отформатированный вывод byte/ wchar_t в stdout, файловый поток или буфер | |
vprintf vfprintf vsprintf vsnprintf | vwprintf vfwprintf vswprintf | Выводит форматированный вывод byte/ wchar_t в stdout, файловый поток или буфер, используя переменный список аргументов | |
ужас | — | Записывает описание текущей ошибки в stderr | |
Позиционирование файла | ftell ftello | Возвращает текущий индикатор позиции файла | |
fseek fseeko | Перемещает индикатор положения файла в определенное место в файле. | ||
fgetpos | Получает индикатор позиции файла | ||
fsetpos | Перемещает индикатор положения файла в определенное место в файле. | ||
перемотка назад | Перемещает индикатор положения файла в начало файла. | ||
Обработка ошибок | яснее | Удаляет ошибки | |
феоф | Проверяет конец файла | ||
феррор | Проверяет наличие ошибок в файле | ||
Операции с файлами | удалять | Удаляет файл | |
переименовать | Переименовывает файл | ||
tmpфайл | Возвращает указатель на временный файл | ||
тмпнам | Возвращает уникальное имя файла |
Константы, определенные в заголовке <stdio.h> , включают:
Имя | Примечания |
---|---|
ЭОФ | Отрицательное целое число типа int, используемое для указания условий конца файла. |
БУФСИЗ | Целое число, представляющее собой размер буфера, используемого функцией setbuf (). |
ИМЯ_ФАЙЛА_МАКС | Размер массива символов , достаточно большой для хранения имени любого файла, который может быть открыт. |
FOPEN_MAX | Количество файлов, которые могут быть открыты одновременно; будет не менее восьми |
_IOFBF | Сокращение для «ввод/вывод полностью буферизован»; это целое число, которое может быть передано функции setvbuf() для запроса блочного буферизованного ввода и вывода для открытого потока. |
_ИОЛБФ | Сокращение для «буферизованная строка ввода/вывода»; это целое число, которое может быть передано функции setvbuf() для запроса буферизованного ввода и вывода для открытого потока. |
_IONBF | Аббревиатура для «ввод/вывод без буферизации»; это целое число, которое может быть передано функции setvbuf() для запроса небуферизованного ввода и вывода для открытого потока. |
L_tmpnam | Размер массива символов , достаточно большой для хранения временного имени файла, сгенерированного функцией tmpnam(). |
НУЛЕВОЙ | Макрос, расширяющийся до константы нулевого указателя ; то есть константы, представляющей значение указателя, которое гарантированно не является допустимым адресом объекта в памяти. |
SEEK_CUR | Целое число, которое может быть передано функции fseek() для запроса позиционирования относительно текущей позиции файла. |
SEEK_END | Целое число, которое может быть передано функции fseek() для запроса позиционирования относительно конца файла. |
SEEK_SET | Целое число, которое может быть передано функции fseek() для запроса позиционирования относительно начала файла. |
TMP_MAX | Максимальное количество уникальных имен файлов, которые может сгенерировать функция tmpnam() , будет не менее 25. |
Переменные, определенные в заголовке <stdio.h> , включают:
Имя | Примечания |
---|---|
стандартный ввод | Указатель на ФАЙЛ , который ссылается на стандартный поток ввода, обычно на клавиатуру. |
стандартный вывод | Указатель на ФАЙЛ , который ссылается на стандартный поток вывода, обычно на дисплейный терминал. |
stderr | Указатель на ФАЙЛ , который ссылается на стандартный поток ошибок, часто на дисплейный терминал. |
Типы данных, определенные в заголовке <stdio.h> , включают:
Стандарт POSIX определяет несколько расширений stdio в своих базовых определениях, среди которых функция readline , выделяющая память, функции fileno и fdopen , устанавливающие связь между объектами FILE и файловыми дескрипторами , а также группа функций для создания объектов FILE , ссылающихся на буферы в памяти. [5]
Следующая программа на языке C открывает двоичный файл с именем myfile , считывает из него пять байтов, а затем закрывает файл.
#include <stdio.h> #include <stdlib.h> int main ( void ) { char buffer [ 5 ]; ФАЙЛ * fp = fopen ( "myfile" , "rb" ); если ( fp == NULL ) { perror ( "Не удалось открыть файл \" myfile \" " ); return EXIT_FAILURE ; } если ( fread ( buffer , 1 , 5 , fp ) < 5 ) { fclose ( fp ); fputs ( "Произошла ошибка при чтении файла. \n " , stderr ); return EXIT_FAILURE ; } fclose ( fp ); printf ( "Прочитано байтов: " ); for ( int i = 0 ; i < 5 ; ++ i ) { printf ( "%02X" , buffer [ i ]); } putchar ( '\n' ); вернуть EXIT_SUCCESS ; }
Было разработано несколько альтернатив stdio . Среди них — библиотека C++ iostream , часть стандарта ISO C++ . ISO C++ по-прежнему требует функционал stdio .
Другие альтернативы включают библиотеку Sfio [6] (A Safe/Fast I/O Library) от AT&T Bell Laboratories . Эта библиотека, представленная в 1991 году, была направлена на избежание несоответствий, небезопасных практик и неэффективности в дизайне stdio . Среди ее возможностей — возможность вставлять функции обратного вызова в поток для настройки обработки данных, считываемых из потока или записываемых в него. [7] Она была выпущена во внешний мир в 1997 году, а последний релиз состоялся 1 февраля 2005 года. [8]
{{cite web}}
: CS1 maint: bot: original URL status unknown (link)