Стандартная библиотека C |
---|
Общие темы |
Разные заголовки |
Язык программирования C предоставляет множество стандартных библиотечных функций для ввода и вывода файлов . Эти функции составляют основную часть заголовка стандартной библиотеки C <stdio.h> . [1] Функциональность происходит от «портативного пакета ввода-вывода», написанного Майком Леском из Bell Labs в начале 1970-х годов [2] и официально вошедшего в состав операционной системы Unix в версии 7 . [3]
Функциональность ввода-вывода языка 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 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)
- возвратная блокировка (требуется с 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 ) { буфер символов [ 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.
- Перейти ↑ McIlroy, MD (1987). Читатель Research Unix: аннотированные выдержки из Руководства программиста, 1971–1986 (PDF) (технический отчет). CSTR. Bell Labs. 139.
- ^ http://www.cplusplus.com/reference/cstdio/
- ^ - Справочник по базовым определениям, Единая спецификация UNIX , выпуск 7 от Open Group
- ^ SFIO: Библиотека безопасного / быстрого ввода-вывода на Wayback Machine (архивировано 11 февраля 2006 г.)
- ^ Корн, Дэвид Г .; Во, Кием-Фонг (1991). SFIO: безопасный / быстрый ввод-вывод строки / файла . Proc. Летняя конференция USENIX. CiteSeerX 10.1.1.51.6574 .
- ^ Фаулер, Гленн С .; Корн, Дэвид Дж .; Во, Кием-Фонг (2000). Расширенное форматирование с помощью Sfio . Proc. Летняя конференция USENIX.
Внешние ссылки [ править ]
В Викиуке по программированию на C есть страница по теме: Программирование на C / Справочник по C |
- СМИ, относящиеся к вводу / выводу файлов C на Викискладе?