Ввод/вывод файла C

Функциональность ввода/вывода на языке программирования C

Язык программирования 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 из файлового потока
fgetsfgetwsСчитывает строку byte/ wchar_t из потока файла
fputc
путc
fputwc
putwc
Записывает byte/ wchar_t в файловый поток
fputsfputwsЗаписывает строку byte/ wchar_t в файловый поток
получитьчарgetwcharСчитывает byte/ wchar_t из stdin
получаетСчитывает строку байтов из stdin до тех пор, пока не встретится новая строка или конец файла (устарело в C99, удалено из C11)
путчарputwcharЗаписывает byte/ wchar_t в stdout
ставитЗаписывает строку байтов в stdout
ungetcungetwcПомещает 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> , включают:

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

Расширения

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

Было разработано несколько альтернатив 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]

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

Ссылки

  1. ^ Спецификация ISO/IEC 9899:1999 . стр. 274, § 7.19.
  2. ^ Керниган, Брайан ; Пайк, Роб (1984). Среда программирования UNIX . Englewood Cliffs : Prentice Hall . стр. 200. Bibcode :1984upe..book.....K.
  3. ^ Макилрой, МД (1987). Исследовательский ридер Unix: аннотированные выдержки из Руководства программиста, 1971–1986 (PDF) (Технический отчет). CSTR. Bell Labs. 139.
  4. ^ "(stdio.h) - Справочник по C++". C++ . Получено 25 июля 2021 г. .
  5. ^ stdio.h  – Справочник базовых определений, Единая спецификация UNIX , версия 4 от The Open Group
  6. ^ "Sfio: A Safe/Fast I/O Library". Архивировано из оригинала 11 февраля 2006 года . Получено 16 марта 2021 года .{{cite web}}: CS1 maint: bot: original URL status unknown (link)
  7. ^ Корн, Дэвид Г .; Во, Кием-Фонг (1991). SFIO: Безопасный/быстрый строковый/файловый ввод-вывод . Труды летней конференции USENIX. CiteSeerX 10.1.1.51.6574 . 
  8. ^ Фаулер, Гленн С.; Корн, Дэвид Г.; Во, Кием-Фонг (2000). Расширенное форматирование с помощью Sfio . Труды летней конференции USENIX.
  • Медиафайлы, связанные с вводом/выводом файлов C на Wikimedia Commons
Retrieved from "https://en.wikipedia.org/w/index.php?title=C_file_input/output&oldid=1253329078#sprintf"