Язык программирования 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 ) { 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 . Среди них — библиотека 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]
{{cite web}}
: CS1 maint: bot: original URL status unknown (link)