Язык программирования C предоставляет множество стандартных библиотечных функций для ввода и вывода файлов . Эти функции составляют основную часть заголовка стандартной библиотеки C
Функциональность ввода-вывода языка C по современным стандартам довольно низка; С абстрагирует все файловые операции в операцию на потоки из байт , которые могут быть «входными потоками» или «выходные потоки». В отличие от некоторых более ранних языков программирования, C не имеет прямой поддержки файлов данных с произвольным доступом ; для чтения из записи в середине файла, программист должен создать поток, стремиться к середине файла, а затем прочитать байты в последовательности из потока.
Потоковая модель файлового ввода-вывода была популяризирована Unix, которая разрабатывалась одновременно с самим языком программирования C. Подавляющее большинство современных операционных систем унаследовали потоки от Unix, и многие языки в семействе языков программирования C унаследовали интерфейс файлового ввода-вывода C с небольшими изменениями (например, PHP ).
Обзор
Эта библиотека использует так называемые потоки для работы с физическими устройствами, такими как клавиатуры, принтеры, терминалы или с любыми другими типами файлов, поддерживаемыми системой. Потоки - это абстракция для единообразного взаимодействия с ними. Все потоки имеют одинаковые свойства независимо от индивидуальных характеристик физического носителя, с которым они связаны. [4]
Функции
Большинство функций ввода / вывода файла C определены в
Байтовый символ | Широкий характер | Описание | |
---|---|---|---|
Доступ к файлам | fopen | Открывает файл (с именем файла, отличным от Unicode, в Windows и, возможно, с именем UTF-8 в Linux) | |
открыто | Открывает другой файл с существующим потоком | ||
fflush | Синхронизирует выходной поток с фактическим файлом | ||
fclose | Закрывает файл | ||
Setbuf | Устанавливает буфер для файлового потока | ||
setvbuf | Устанавливает буфер и его размер для файлового потока | ||
fwide | Переключает файловый поток между вводом-выводом расширенных символов и вводом-выводом узких символов. | ||
Прямой ввод / вывод | бояться | Читает из файла | |
fwrite | Записывает в файл | ||
Неформатированный ввод / вывод | fgetc getc | fgetwc getwc | Читает байт / wchar_t из файлового потока |
fgets | fgetws | Читает байт / строка wchar_t из файлового потока | |
fputc putc | fputwc putwc | Записывает байт / wchar_t в файловый поток | |
fputs | fputws | Записывает байт / wchar_t строка в файловый поток | |
Getchar | Getwchar | Читает байт / wchar_t из стандартного ввода | |
N / A | Считывает байтовую строку из стандартного ввода до тех пор, пока не будет обнаружена новая строка или конец файла (устарело в C99, удалено из C11) | ||
путчар | путчар | Записывает байт / wchar_t в стандартный вывод | |
ставит | N / A | Записывает байтовую строку в стандартный вывод | |
Ungetc | ungetwc | Ставит байт / 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 | Печатает отформатированный байт / вывод wchar_t в стандартный вывод, файловый поток или буфер | |
vprintf vfprintf vsprintf vsnprintf | vwprintf vfwprintf vswprintf | Печатает отформатированный байт / вывод wchar_t в стандартный вывод, файловый поток или буфер с использованием списка переменных аргументов | |
перрор | N / A | Записывает описание текущей ошибки в stderr | |
Позиционирование файла | ftell ftello | Возвращает индикатор текущей позиции файла | |
fseek fseeko | Перемещает индикатор положения файла в определенное место в файле | ||
fgetpos | Получает индикатор позиции файла | ||
fsetpos | Перемещает индикатор положения файла в определенное место в файле | ||
перемотка | Перемещает индикатор позиции файла в начало файла | ||
Обработка ошибок | яснее | Удаляет ошибки | |
Feof | Проверяет конец файла | ||
Ferror | Проверяет наличие файловой ошибки | ||
Операции с файлами | Удалить | Стирает файл | |
переименовать | Переименовывает файл | ||
tmpfile | Возвращает указатель на временный файл | ||
tmpnam | Возвращает уникальное имя файла |
Константы
Константы, определенные в Заголовок
Имя | Заметки |
---|---|
EOF | Отрицательное целое число типа int используется для обозначения условий конца файла |
БУФСИЗ | Целое число, которое представляет собой размер буфера, используемого setbuf () функция |
FILENAME_MAX | Размер массив символов, достаточно большой для хранения имени любого файла, который может быть открыт |
FOPEN_MAX | Количество файлов, которые могут быть открыты одновременно; будет не меньше восьми |
_IOFBF | Сокращение от «полностью буферизованный ввод / вывод»; это целое число, которое может быть передано в Функция setvbuf () для запроса ввода и вывода с блочной буферизацией для открытого потока |
_IOLBF | Сокращенное обозначение «буферизованная линия ввода / вывода»; это целое число, которое может быть передано в Функция setvbuf () для запроса строковой буферизации ввода и вывода для открытого потока |
_IONBF | Сокращенное обозначение «ввод / вывод без буферизации»; это целое число, которое может быть передано в функция setvbuf () для запроса небуферизованного ввода и вывода для открытого потока |
L_tmpnam | Размер массив char, который достаточно велик для хранения временного имени файла, сгенерированного функция tmpnam () |
НОЛЬ | Макрос, расширяющийся до константы нулевого указателя ; то есть константа, представляющая значение указателя, которое гарантированно не является действительным адресом объекта в памяти. |
SEEK_CUR | Целое число, которое может быть передано в функция fseek () для запроса позиционирования относительно текущей позиции файла |
SEEK_END | Целое число, которое может быть передано в функция fseek () для запроса позиционирования относительно конца файла |
SEEK_SET | Целое число, которое может быть передано в функция fseek () для запроса позиционирования относительно начала файла |
TMP_MAX | Максимальное количество уникальных имен файлов, генерируемых функция tmpnam () ; будет не менее 25 |
Переменные
Переменные, определенные в Заголовок
Имя | Заметки |
---|---|
стандартный ввод | Указатель на ФАЙЛ, который относится к стандартному входному потоку, обычно к клавиатуре. |
стандартный вывод | Указатель на ФАЙЛ, который относится к стандартному потоку вывода, обычно терминалу дисплея. |
stderr | Указатель на ФАЙЛ, который относится к стандартному потоку ошибок, часто к дисплею. |
Типы участников
Типы данных, определенные в Заголовок
- ФАЙЛ - также известный какдескриптор файла , это непрозрачный тип, содержащий информацию о файле или текстовом потоке, необходимую для выполнения операций ввода или вывода с ним, включая:
- зависящий от платформы идентификатор связанного устройства ввода-вывода, например файловый дескриптор
- буфер
- индикатор ориентации потока (неустановленный, узкий или широкий)
- индикатор состояния буферизации потока (без буферизации, с буферизацией по строке, с полной буферизацией)
- Индикатор режима ввода-вывода (входной поток, выходной поток или поток обновления)
- индикатор двоичного / текстового режима
- индикатор конца файла
- индикатор ошибки
- текущая позиция в потоке и состояние многобайтового преобразования (объект типа mbstate_t)
- возвратная блокировка (требуется с C11 )
- fpos_t - тип без массива, способный однозначно определять позицию каждого байта в файле и каждое состояние преобразования, которое может произойти во всех поддерживаемых кодировках многобайтовых символов.
- size_t - беззнаковый целочисленный тип, который является типом результата оператор sizeof .
Расширения
Стандарт POSIX определяет несколько расширений для stdio в его базовых определениях, среди которых функция readline, которая выделяет память, fileno и fdopen функции, которые устанавливают связь между Объекты FILE и файловые дескрипторы , а также группа функций для создания Объекты FILE, которые относятся к буферам в памяти. [5]
Пример
Следующая программа на C открывает двоичный файл с именем myfile , считывает из него пять байтов и затем закрывает файл.
#include #include int main ( void ) { буфер символов [ 5 ]; ФАЙЛ * fp = fopen ( "myfile" , "rb" ); if ( fp == NULL ) { perror ( "Не удалось открыть файл \" myfile \ " " ); вернуть EXIT_FAILURE ; } для ( int я = 0 ; я < 5 ; я ++ ) { int rc = getc ( fp ); if ( rc == EOF ) { fputs ( "Произошла ошибка при чтении файла. \ n " , stderr ); вернуть EXIT_FAILURE ; } буфер [ я ] = rc ; } fclose ( fp ); printf ( "Считанные байты были ...% x% x% x% x% x \ n " , buffer [ 0 ], buffer [ 1 ], buffer [ 2 ], buffer [ 3 ], buffer [ 4 ]); вернуть EXIT_SUCCESS ; }
Альтернативы stdio
Несколько альтернатив stdio были разработаны. Среди них C ++ Библиотека iostream , часть стандарта ISO C ++ . ISO C ++ по-прежнему требует Функциональность stdio .
Другие альтернативы включают библиотеку SFIO [6] (Библиотека безопасного / быстрого ввода-вывода) от AT&T Bell Laboratories . Эта библиотека, представленная в 1991 году, была направлена на то, чтобы избежать несоответствий, небезопасных методов и неэффективности при разработке stdio . Среди его функций - возможность вставки функций обратного вызова в поток для настройки обработки данных, считываемых из потока или записываемых в поток. [7] Он был выпущен для внешнего мира в 1997 году, а последним выпуском был 20050201. [8]
Смотрите также
- строка формата printf
- строка формата scanf
Рекомендации
- ^ ISO / IEC 9899: 1999 спецификация (PDF) . п. 274, § 7.19.
- ^ Керниган, Брайан ; Пайк, Роб (1984). Среда программирования UNIX . Энглвудские скалы : Прентис-холл . п. 200.
- ^ Макилрой, доктор медицины (1987). Читатель Research Unix: аннотированные выдержки из Руководства программиста, 1971–1986 (PDF) (технический отчет). CSTR. Bell Labs. 139.
- ^ http://www.cplusplus.com/reference/cstdio/
- ^ - Справочник по базовым определениям, Единая спецификация UNIX , выпуск 7 от Open Group
- ^ «SFIO: безопасная / быстрая библиотека ввода-вывода» . Архивировано 11 февраля 2006 года . Проверено 16 марта 2021 года .CS1 maint: bot: исходный статус URL неизвестен ( ссылка )
- ^ Корн, Дэвид Г .; Во, Кием-Фонг (1991). SFIO: безопасный / быстрый ввод-вывод строки / файла . Proc. Летняя конференция USENIX. CiteSeerX 10.1.1.51.6574 .
- ^ Fowler, Glenn S .; Корн, Дэвид Дж .; Во, Кием-Фонг (2000). Расширенное форматирование с помощью Sfio . Proc. Летняя конференция USENIX.
Внешние ссылки
- СМИ, относящиеся к вводу / выводу файлов C на Викискладе?