Язык программирования 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 ).
Константы, определенные в заголовке <stdio.h> , включают:
Переменные, определенные в заголовке <stdio.h> , включают:
Типы данных, определенные в заголовке <stdio.h> , включают:
Стандарт POSIX определяет несколько расширений stdio в своих базовых определениях, среди которых функция readline , выделяющая память, функции fileno и fdopen , которые устанавливают связь между объектами FILE и файловыми дескрипторами , а также группа функций для создания объектов FILE , которые ссылаются на в буферы в памяти. [5]
Следующая программа на языке C открывает двоичный файл с именем myfile , считывает из него пять байтов, а затем закрывает файл.
#include <stdio.h> #include <stdlib.h> int main ( void ) { charbuffer [ 5 ] ; ФАЙЛ * fp = fopen ( "myfile" , "rb" ); if ( fp == NULL ) { perror ( «Не удалось открыть файл \" myfile \" » ); вернуть EXIT_FAILURE ; } if ( fread ( buffer , 1 , 5 , fp ) < 5 ) { fputs ( «Произошла ошибка при чтении файла. \n » , stderr ); вернуть EXIT_FAILURE ; } fзакрыть ( фп ); printf ( "Прочитанные байты: " ); for ( int i = 0 ; i < 5 ; ++ i ) { printf ( «%02X» , буфер [ i ]); } Путчар ( '\n' ); вернуть EXIT_SUCCESS ; }
Было разработано несколько альтернатив stdio . Среди них — библиотека C++ iostream , часть стандарта ISO C++ . ISO C++ по-прежнему требует функциональности stdio .
Другие альтернативы включают библиотеку Sfio [6] (Библиотека безопасного/быстрого ввода-вывода) от AT&T Bell Laboratories . Эта библиотека, представленная в 1991 году, была призвана избежать несоответствий, небезопасных практик и неэффективности при разработке stdio . Среди его особенностей — возможность вставлять в поток функции обратного вызова для настройки обработки данных, считываемых из потока или записываемых в него. [7] Он был выпущен для внешнего мира в 1997 году, а последний выпуск состоялся 1 февраля 2005 года. [8]
{{cite web}}
: CS1 maint: bot: original URL status unknown (link)