Ввод / вывод файла C - C file input/output
Стандартная библиотека C |
---|
Общие темы |
Разные заголовки |
Язык программирования C предоставляет множество стандартных библиотечных функций для ввода и вывода файлов . Эти функции составляют основную часть заголовка стандартной библиотеки C <stdio.h> . Функциональность происходит от «портативного пакета ввода-вывода», написанного Майком Леском из Bell Labs в начале 1970-х годов, и официально стала частью операционной системы Unix в версии 7 .
Функциональность ввода-вывода языка C по современным стандартам довольно низка; С абстрагирует все файловые операции в операцию на потоки из байт , которые могут быть «входными потоками» или «выходные потоки». В отличие от некоторых более ранних языков программирования, C не имеет прямой поддержки файлов данных с произвольным доступом ; для чтения из записи в середине файла, программист должен создать поток, стремиться к середине файла, а затем прочитать байты в последовательности из потока.
Потоковая модель файлового ввода-вывода была популяризирована Unix, которая разрабатывалась одновременно с самим языком программирования C. Подавляющее большинство современных операционных систем унаследовали потоки от Unix, и многие языки в семействе языков программирования C унаследовали интерфейс файлового ввода-вывода C с небольшими изменениями (например, PHP ).
Обзор
Эта библиотека использует так называемые потоки для работы с физическими устройствами, такими как клавиатуры, принтеры, терминалы, или с любыми другими типами файлов, поддерживаемыми системой. Потоки - это абстракция для единообразного взаимодействия с ними. Все потоки имеют одинаковые свойства независимо от индивидуальных характеристик физического носителя, с которым они связаны.
Функции
Большинство функций ввода / вывода файла C определены в <stdio.h> (или в заголовке C ++ cstdio , который содержит стандартные функции C, но в пространстве имен std ).
Байтовый символ |
Широкий характер |
Описание | |
---|---|---|---|
Доступ к файлам | fopen | Открывает файл (с именем файла, отличным от Unicode, в Windows и, возможно, с именем UTF-8 в Linux) | |
открыто | Открывает другой файл с существующим потоком | ||
fflush | Синхронизирует выходной поток с фактическим файлом | ||
fclose | Закрывает файл | ||
Setbuf | Устанавливает буфер для файлового потока | ||
setvbuf | Устанавливает буфер и его размер для файлового потока | ||
fwide | Переключает файловый поток между вводом-выводом расширенных символов и вводом-выводом узких символов. | ||
Прямой ввод / вывод |
бояться | Читает из файла | |
fwrite | Записывает в файл | ||
Неформатированный ввод / вывод |
fgetc getc |
fgetwc getwc |
Читает байт / wchar_t из файлового потока |
fgets | fgetws | Читает строку byte / wchar_t из файлового потока | |
fputc putc |
fputwc putwc |
Записывает байт / wchar_t в файловый поток | |
fputs | fputws | Записывает строку byte / wchar_t в файловый поток | |
Getchar | Getwchar | Читает байт / wchar_t из стандартного ввода | |
|
N / A | Считывает байтовую строку из стандартного ввода до тех пор, пока не будет обнаружена новая строка или конец файла (устарело в C99, удалено из C11) | |
путчар | путчар | Записывает байт / wchar_t в стандартный вывод | |
ставит | N / A | Записывает байтовую строку в стандартный вывод | |
Ungetc | ungetwc | Помещает байт / wchar_t обратно в файловый поток | |
Форматированный ввод / вывод |
scanf fscanf sscanf |
wscanf fwscanf swscanf |
Читает форматированный ввод byte / wchar_t из стандартного ввода, файлового потока или буфера |
vscanf vfscanf vsscanf |
vwscanf vfwscanf vswscanf |
Считывает форматированный входной байт / wchar_t из стандартного ввода , файлового потока или буфера, используя список переменных аргументов |
|
printf fprintf sprintf snprintf |
wprintf fwprintf swprintf |
Выводит форматированный вывод byte / wchar_t в стандартный вывод, файловый поток или буфер |
|
vprintf vfprintf vsprintf vsnprintf |
vwprintf vfwprintf vswprintf |
Выводит форматированный вывод byte / wchar_t в стандартный вывод, файловый поток или буфер, используя список переменных аргументов |
|
перрор | N / A | Записывает описание текущей ошибки в stderr | |
Позиционирование файла |
ftell ftello |
Возвращает индикатор текущей позиции файла | |
fseek fseeko |
Перемещает индикатор положения файла в определенное место в файле | ||
fgetpos | Получает индикатор позиции файла | ||
fsetpos | Перемещает индикатор положения файла в определенное место в файле | ||
перемотка | Перемещает индикатор позиции файла в начало файла | ||
Обработка ошибок |
яснее | Удаляет ошибки | |
Feof | Проверяет конец файла | ||
Ferror | Проверяет наличие файловой ошибки | ||
Операции с файлами |
Удалить | Стирает файл | |
переименовать | Переименовывает файл | ||
tmpfile | Возвращает указатель на временный файл | ||
tmpnam | Возвращает уникальное имя файла |
Константы
Константы, определенные в заголовке <stdio.h>, включают:
Имя | Примечания |
---|---|
EOF | Отрицательное целое число типа int, используемое для обозначения условий конца файла. |
БУФСИЗ | Целое число , которое является размер буфера , используемый setbuf () функции |
FILENAME_MAX | Размер массива символов, который достаточно велик для хранения имени любого файла, который может быть открыт. |
FOPEN_MAX | Количество файлов, которые могут быть открыты одновременно; будет не меньше восьми |
_IOFBF | Аббревиатура от «полностью буферизованный ввод / вывод»; это целое число, которое может быть передано в функцию setvbuf () для запроса ввода и вывода с блочной буферизацией для открытого потока |
_IOLBF | Сокращенное обозначение «буферизованная линия ввода / вывода»; это целое число, которое может быть передано в функцию setvbuf () для запроса строковой буферизации ввода и вывода для открытого потока |
_IONBF | Сокращенное обозначение «ввод / вывод без буферизации»; это целое число, которое может быть передано в функцию setvbuf () для запроса небуферизованного ввода и вывода для открытого потока |
L_tmpnam | Размер массива символов, который достаточно велик для хранения временного имени файла, созданного функцией tmpnam (). |
НУЛЕВОЙ | Макрос, расширяющийся до константы нулевого указателя ; то есть константа, представляющая значение указателя, которое гарантированно не является действительным адресом объекта в памяти. |
SEEK_CUR | Целое число, которое может быть передано в функцию fseek () для запроса позиционирования относительно текущей позиции файла. |
SEEK_END | Целое число, которое может быть передано в функцию fseek () для запроса позиционирования относительно конца файла. |
SEEK_SET | Целое число, которое может быть передано в функцию fseek () для запроса позиционирования относительно начала файла. |
TMP_MAX | Максимальное количество уникальных имен файлов, генерируемых функцией tmpnam () ; будет не менее 25 |
Переменные
Переменные, определенные в заголовке <stdio.h>, включают:
Имя | Примечания |
---|---|
стандартный ввод | Указатель на ФАЙЛ, который относится к стандартному потоку ввода, обычно клавиатуре. |
стандартный вывод | Указатель на ФАЙЛ, который относится к стандартному потоку вывода, обычно терминалу дисплея. |
stderr | Указатель на ФАЙЛ, который относится к стандартному потоку ошибок, часто к дисплею. |
Типы участников
Типы данных, определенные в заголовке <stdio.h>, включают:
-
ФАЙЛ - также известный какдескриптор файла , это непрозрачный тип, содержащий информацию о файле или текстовом потоке, необходимую для выполнения операций ввода или вывода с ним, включая:
- зависящий от платформы идентификатор связанного устройства ввода-вывода, например файловый дескриптор
- буфер
- индикатор ориентации потока (неустановленный, узкий или широкий)
- индикатор состояния буферизации потока (без буферизации, с буферизацией по строке, с полной буферизацией)
- Индикатор режима ввода-вывода (входной поток, выходной поток или поток обновления)
- индикатор двоичного / текстового режима
- индикатор конца файла
- индикатор ошибки
- текущая позиция в потоке и состояние многобайтового преобразования (объект типа mbstate_t)
- возвратная блокировка (требуется начиная с
Расширения
Стандарт POSIX определяет несколько расширений для stdio в своих базовых определениях, среди которых функция readline, которая выделяет память, функции fileno и fdopen, которые устанавливают связь между объектами FILE и дескрипторами файлов , а также группа функций для создания объектов FILE, которые ссылаются на в буферы в памяти.
Пример
Следующая программа на 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;
}
for (int i = 0; i < 5; i++) {
int rc = getc(fp);
if (rc == EOF) {
fputs("An error occurred while reading the file.\n", stderr);
return EXIT_FAILURE;
}
buffer[i] = rc;
}
fclose(fp);
printf("The bytes read were... %x %x %x %x %x\n", buffer[0], buffer[1],
buffer[2], buffer[3], buffer[4]);
return EXIT_SUCCESS;
}
Альтернативы stdio
Было разработано несколько альтернатив stdio . Среди них - библиотека C ++ iostream , часть стандарта ISO C ++ . ISO C ++ по-прежнему требует функциональности stdio .
Другие альтернативы включают библиотеку SFIO (библиотека безопасного / быстрого ввода-вывода) от AT&T Bell Laboratories . Эта библиотека, представленная в 1991 году, была направлена на то, чтобы избежать несоответствий, небезопасных практик и неэффективности в дизайне stdio . Среди его функций - возможность вставки функций обратного вызова в поток для настройки обработки данных, считываемых из потока или записываемых в поток. Он был выпущен для внешнего мира в 1997 году, а последний выпуск - 1 февраля 2005 года.
Смотрите также
использованная литература
внешние ссылки
- СМИ, относящиеся к вводу / выводу файлов C на Викискладе?