Ввод / вывод файла C - C file input/output

Язык программирования 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

Переменные

Stdstreams-notitle.svg

Переменные, определенные в заголовке <stdio.h>, включают:

Имя Примечания
стандартный ввод Указатель на ФАЙЛ, который относится к стандартному потоку ввода, обычно клавиатуре.
стандартный вывод Указатель на ФАЙЛ, который относится к стандартному потоку вывода, обычно терминалу дисплея.
stderr Указатель на ФАЙЛ, который относится к стандартному потоку ошибок, часто к дисплею.

Типы участников

Типы данных, определенные в заголовке <stdio.h>, включают:

  • ФАЙЛ - также известный какдескриптор файла , это непрозрачный тип, содержащий информацию о файле или текстовом потоке, необходимую для выполнения операций ввода или вывода с ним, включая:
    • зависящий от платформы идентификатор связанного устройства ввода-вывода, например файловый дескриптор
    • буфер
    • индикатор ориентации потока (неустановленный, узкий или широкий)
    • индикатор состояния буферизации потока (без буферизации, с буферизацией по строке, с полной буферизацией)
    • Индикатор режима ввода-вывода (входной поток, выходной поток или поток обновления)
    • индикатор двоичного / текстового режима
    • индикатор конца файла
    • индикатор ошибки
    • текущая позиция в потоке и состояние многобайтового преобразования (объект типа mbstate_t)
    • возвратная блокировка (требуется начиная с
    C11 )
  • fpos_t - тип без массива, способный однозначно определять позицию каждого байта в файле и каждое состояние преобразования, которое может произойти во всех поддерживаемых кодировках многобайтовых символов
  • size_t - беззнаковый целочисленный тип, являющийся типом результата оператора sizeof .
  • Расширения

    Стандарт 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 года.

    Смотрите также

    использованная литература

    внешние ссылки