Ввод/вывод файла C
Стандартная библиотека 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 пространство имен ).
Байт характер |
Широкий характер |
Описание | |
---|---|---|---|
Доступ к файлам | открыть | Открывает файл (с именем файла, отличным от Unicode в Windows, и возможным именем файла UTF-8 в Linux). | |
свободный доступ | Открывает другой файл с существующим потоком | ||
смыть | Синхронизирует выходной поток с реальным файлом | ||
fзакрыть | Закрывает файл | ||
setbuf | Устанавливает буфер для файлового потока | ||
setvbuf | Устанавливает буфер и его размер для файлового потока. | ||
по всему миру | Переключает поток файлов между вводом-выводом с широкими символами и вводом-выводом с узкими символами. | ||
Прямой ввод/вывод |
бояться | Читает из файла | |
написать | Записывает в файл | ||
Неформатированный ввод/вывод |
fgetc получить |
вставать вставать |
Читает байт/ wchar_t из файлового потока |
fgets | плод | Читает байт/ строка wchar_t из файлового потока | |
fputc putc |
fputwc удар |
Записывает байт/ wchar_t в файловый поток | |
fputs | fputws | Записывает байт/ строка wchar_t в файловый поток | |
получитьчар | подойти ближе | Читает байт/ wchar_t из стандартного ввода | |
— | Считывает строку байтов из стандартного ввода до тех пор, пока не встретится новая строка или конец файла (устарело в C99, удалено из C11). | ||
putchar | шлюха | Записывает байт/ wchar_t в стандартный вывод | |
ставит | — | Записывает строку байтов в стандартный вывод | |
смазка и т. д. | синглтон | Помещает байт/ wchar_t обратно в файловый поток | |
Отформатированный ввод/вывод |
сканирование fscanf sscanf |
wscanf fwscanf swscanf |
Читает форматированный байт/ wchar_t со стандартного ввода, ввод файловый поток или буфер |
всканф vfscanf vsscanf |
vwscanf vfwscanf vswscanf |
Считывает форматированный входной байт/ wchar_t из стандартного ввода, файловый поток или буфер с использованием списка переменных аргументов | |
печать fprintf спринтф snprintf |
wprintf fwprintf swprintf |
Печатает форматированный байт/ вывод wchar_t на стандартный вывод, файловый поток или буфер | |
vprintf vfprintf vsprintf vsnprintf |
vwprintf vfwprintf vswprintf |
Печатает форматированный байт/ вывод wchar_t на стандартный вывод, файловый поток или буфер с использованием списка переменных аргументов | |
ошибка | — | Записывает описание текущей ошибки в stderr. | |
Позиционирование файла | сказать брат |
Возвращает индикатор текущей позиции файла | |
fseek из fsee |
Перемещает индикатор положения файла в определенное место в файле. | ||
fgetpost | Получает индикатор позиции файла | ||
fsetpos | Перемещает индикатор положения файла в определенное место в файле. | ||
перемотать назад | Перемещает индикатор позиции файла в начало файла. | ||
Ошибка умение обращаться |
ясно | Очищает ошибки | |
Феоф | Проверяет конец файла | ||
ужас | Проверяет наличие ошибок в файле | ||
Операции в файлах |
удалять | Стирает файл | |
переименовывать | Переименовывает файл | ||
tmp-файл | Возвращает указатель на временный файл | ||
tmpnam | Возвращает уникальное имя файла |
Константы
[ редактировать ]Константы, определенные в Заголовок <stdio.h> включает в себя:
Имя | Примечания |
---|---|
ЭОФ | Отрицательное целое число типа int используется для обозначения условий конца файла |
БЕЗ БАФА | Целое число, которое представляет собой размер буфера, используемого setbuf() функция |
FILENAME_MAX | Размер массив символов , достаточно большой для хранения имени любого файла, который можно открыть. |
FOPEN_MAX | Количество файлов, которые могут быть открыты одновременно; будет минимум восемь |
_ИОФБФ | Аббревиатура от «полностью буферизованный ввод/вывод»; это целое число, которое можно передать в setvbuf() Функция для запроса буферизованного ввода и вывода для открытого потока |
_ИОЛБФ | Аббревиатура от «буферизованная строка ввода/вывода»; это целое число, которое можно передать в setvbuf() Функция для запроса строкового буферизованного ввода и вывода для открытого потока |
_IONBF | Сокращение от «ввод/вывод без буферизации»; это целое число, которое можно передать в Функция setvbuf() для запроса небуферизованного ввода и вывода для открытого потока |
L_tmpnam | Размер массив символов , достаточно большой для хранения временного имени файла, сгенерированного tmpnam() функция |
НУЛЕВОЙ | Макрос, расширяющийся до константы нулевого указателя ; то есть константа, представляющая значение указателя, которое гарантированно не будет действительным адресом объекта в памяти. |
SEEK_CUR | Целое число, которое можно передать в Функция fseek() для запроса позиционирования относительно текущей позиции файла |
SEEK_END | Целое число, которое можно передать в Функция fseek() для запроса позиционирования относительно конца файла |
SEEK_SET | Целое число, которое можно передать в Функция fseek() для запроса позиционирования относительно начала файла |
ТМП_МАКС | Максимальное количество уникальных имен файлов, генерируемых tmpnam() функция ; будет минимум 25 |
Переменные
[ редактировать ]Переменные, определенные в Заголовок <stdio.h> включает в себя:
Имя | Примечания |
---|---|
стандартный ввод | Указатель на ФАЙЛ , который относится к стандартному потоку ввода, обычно с клавиатуры. |
стандартный вывод | Указатель на ФАЙЛ , который относится к стандартному потоку вывода, обычно это дисплейный терминал. |
stderr | Указатель на ФАЙЛ , который относится к стандартному потоку ошибок, часто это дисплейный терминал. |
Типы участников
[ редактировать ]Типы данных, определенные в Заголовок <stdio.h> включает в себя:
- ФАЙЛ – также известный как файла дескриптор или Указатель FILE , это непрозрачный указатель , содержащий информацию о файле или текстовом потоке, необходимую для выполнения над ним операций ввода или вывода, в том числе:
- специфичный для платформы идентификатор соответствующего устройства ввода-вывода, например файловый дескриптор
- буфер
- индикатор ориентации потока (не установлен, узкий или широкий)
- индикатор состояния буферизации потока (без буферизации, с строковой буферизацией, с полной буферизацией)
- Индикатор режима ввода-вывода (входной поток, выходной поток или поток обновления)
- индикатор двоичного/текстового режима
- индикатор конца файла
- индикатор ошибки
- текущая позиция потока и состояние многобайтового преобразования (объект типа mbstate_t)
- возвратная блокировка (требуется начиная с C11 )
- fpos_t – тип, не являющийся массивом, способный однозначно идентифицировать позицию каждого байта в файле и каждое состояние преобразования, которое может произойти во всех поддерживаемых многобайтовых кодировках символов.
- size_t – целочисленный тип без знака , который является типом результата sizeof . Оператор
Расширения
[ редактировать ]Стандарт POSIX определяет несколько расширений для stdio в своих базовых определениях, среди которых функция readline , которая выделяет память, файлено и функции fdopen , которые устанавливают связь между Объекты FILE и файловые дескрипторы , а также группа функций для создания Объекты FILE , которые ссылаются на буферы в памяти. [5]
Пример
[ редактировать ]Следующая программа на языке C открывает двоичный файл с именем myfile , считывает из него пять байтов, а затем закрывает файл.
#include <stdio.h>
#include <stdlib.h>
int main(void) {
char buffer[5];
FILE* fp = fopen("myfile", "rb");
if (fp == NULL) {
perror("Failed to open file \"myfile\"");
return EXIT_FAILURE;
}
if (fread(buffer, 1, 5, fp) < 5) {
fputs("An error occurred while reading the file.\n", stderr);
return EXIT_FAILURE;
}
fclose(fp);
printf("The bytes read were: ");
for (int i = 0; i < 5; ++i) {
printf("%02X ", buffer[i]);
}
putchar('\n');
return EXIT_SUCCESS;
}
Альтернативы stdio
[ редактировать ]Несколько альтернатив stdio были разработаны. Среди них C++ iostream , часть стандарта ISO C++ . ISO C++ по-прежнему требует функциональность stdio .
Другие альтернативы включают Sfio. [6] (Библиотека безопасного/быстрого ввода-вывода) от AT&T Bell Laboratories . Эта библиотека, представленная в 1991 году, была призвана избежать несоответствий, небезопасных практик и неэффективности при разработке стдио . Среди его особенностей — возможность вставлять в поток функции обратного вызова для настройки обработки данных, считываемых из потока или записываемых в него. [7] Он был выпущен для внешнего мира в 1997 году, а последний релиз состоялся 1 февраля 2005 года. [8]
См. также
[ редактировать ]Ссылки
[ редактировать ]- ^ Спецификация ISO/IEC 9899:1999 . п. 274, § 7.19.
- ^ Керниган, Брайан ; Пайк, Роб (1984). Среда программирования UNIX . Энглвудские скалы : Прентис-холл . п. 200.
- ^ Макилрой, доктор медицины (1987). Читатель Research Unix: аннотированные выдержки из Руководства программиста, 1971–1986 (PDF) (Технический отчет). CSTR. Лаборатории Белла. 139.
- ^ "(stdio.h) — Справочник по C++" . С++ . Проверено 25 июля 2021 г.
- ^ Единая спецификация UNIX , версия 4 от Open Group. – Справочник базовых определений,
- ^ «Sfio: безопасная/быстрая библиотека ввода-вывода» . Архивировано из оригинала 11 февраля 2006 года . Проверено 16 марта 2021 г.
{{cite web}}
: CS1 maint: bot: исходный статус URL неизвестен ( ссылка ) - ^ Корн, Дэвид Г .; Во, Кием-Фонг (1991). SFIO: безопасный/быстрый строковый/файловый ввод-вывод . Учеб. Летняя конференция USENIX. CiteSeerX 10.1.1.51.6574 .
- ^ Фаулер, Гленн С.; Корн, Дэвид Г.; Во, Кием-Фонг (2000). Расширенное форматирование с помощью Sfio . Учеб. Летняя конференция USENIX.
Внешние ссылки
[ редактировать ]- СМИ, связанные с вводом/выводом файлов C, на Wikimedia Commons