Cプログラミング言語は、ファイル入出力用の標準ライブラリ 関数を多数提供しています。これらの関数は、C 標準ライブラリヘッダー< stdio.h >の大部分を占めています。[1]この機能は、1970 年代初頭にベル研究所のMike Leskが作成した「ポータブル I/O パッケージ」に由来しており、 [2]バージョン 7で正式にUnixオペレーティング システムの一部となりました。[3]
C の I/O 機能は、現代の標準からするとかなり低レベルです。C は、すべてのファイル操作をバイト ストリーム (「入力ストリーム」または「出力ストリーム」) に対する操作に抽象化します。以前のプログラミング言語とは異なり、C はランダム アクセスデータ ファイルを直接サポートしていません。ファイルの途中にあるレコードから読み取るには、プログラマーはストリームを作成し、ファイルの途中までシークして、ストリームからバイトを順番に読み取る必要があります。
ファイル I/O のストリーム モデルは、C プログラミング言語と同時に開発された Unix によって普及しました。現代のオペレーティング システムの大部分は Unix からストリームを継承しており、C プログラミング言語ファミリの多くの言語は、ほとんど変更せずに C のファイル I/O インターフェイスを継承しています ( PHPなど)。
概要
このライブラリは、キーボード、プリンター、端末などの物理デバイスや、システムでサポートされているその他の種類のファイルを操作するために、ストリームと呼ばれるものを使用します。ストリームは、これらを統一された方法で操作するための抽象化です。すべてのストリームは、関連付けられている物理メディアの個々の特性とは無関係に、同様のプロパティを持ちます。[4]
機能
C ファイル入出力関数のほとんどは、<stdio.h> (または、標準 C 機能を含みますが、std名前空間にあるC++ヘッダーcstdio ) で定義されています。
定数
<stdio.h>ヘッダーで定義されている定数は次のとおりです。
変数

<stdio.h>ヘッダーで定義されている変数は次のとおりです。
メンバータイプ
<stdio.h>ヘッダーで定義されているデータ型は次のとおりです。
- ファイル– 別名ファイルハンドルまたはFILE ポインター。これは、ファイルまたはテキスト ストリームについて、入力または出力操作を実行するために必要な次の情報を含む
不透明なポインター
- ファイル記述子などの関連するI/Oデバイスのプラットフォーム固有の識別子
- バッファ
- ストリームの方向インジケータ(未設定、狭い、広い)
- ストリーム バッファリング状態インジケーター (バッファなし、ライン バッファ、完全バッファ)
- I/O モード インジケーター (入力ストリーム、出力ストリーム、または更新ストリーム)
- バイナリ/テキストモードインジケーター
- ファイル終了インジケータ
- エラーインジケーター
- 現在のストリーム位置とマルチバイト変換状態(mbstate_t 型のオブジェクト)
- 再入可能ロック( C11以降で必須)
- fpos_t – ファイル内のすべてのバイトの位置と、サポートされているすべてのマルチバイト文字エンコーディングで発生する可能性のあるすべての変換状態を一意に識別できる非配列型
- size_t – sizeof演算子の結果の型である符号なし整数型。
拡張機能
POSIX標準では、基本定義でstdioのいくつかの拡張機能を定義しており、その中には、メモリを割り当てるreadline関数、FILEオブジェクトとファイル記述子間のリンクを確立するfileno関数とfdopen関数、およびメモリ内バッファを参照するFILEオブジェクトを作成するための一連の関数が含まれています。 [5]
例
次の C プログラムは、 myfileというバイナリ ファイルを開き、そこから 5 バイトを読み取ってから、ファイルを閉じます。
#include <stdio.h> #include <stdlib.h>
int main ( void ) { char buffer [ 5 ]; FILE * fp = fopen ( "myfile" , "rb" );
if ( fp == NULL ) { perror ( "ファイル\" myfile \ "を開けませんでした" ); return EXIT_FAILURE ; }
if ( fread ( buffer , 1 , 5 , fp ) < 5 ) { fclose ( fp ); fputs ( "ファイルの読み取り中にエラーが発生しました。\n " , stderr ); return EXIT_FAILURE ; }
fclose ( )メソッド
printf ( "読み取られたバイト数は次のとおりです: " );
for ( int i = 0 ; i < 5 ; ++ i ) { printf ( "%02X " , buffer [ i ]); } putchar ( '\n' );
EXIT_SUCCESSを返します。}
stdio の代替
stdioの代替手段はいくつか開発されています。その中には、 ISO C++ 標準の一部であるC++ iostreamライブラリがあります。ISO C++ では、依然としてstdio機能が必要です。
他の選択肢としては、 AT&Tベル研究所のSfio [6] (A Safe/Fast I/O Library)ライブラリがあります。このライブラリは1991年に導入され、stdioの設計における矛盾、安全でない慣行、非効率性を回避することを目的としていました。その機能の1つは、ストリームにコールバック関数を挿入して、ストリームから読み取ったりストリームに書き込んだりするデータの処理をカスタマイズできることです。[7]これは1997年に外部にリリースされ、最後のリリースは2005年2月1日でした。[8]
参照
参考文献
- ^ ISO/IEC 9899:1999 仕様。274 ページ、§ 7.19。
- ^ カーニハン、ブライアン、パイク、ロブ(1984)。UNIXプログラミング環境。エングルウッドクリフス:プレンティスホール。p. 200。Bibcode : 1984upe..book.....K.
- ^ McIlroy, MD (1987). A Research Unix reader: annotated excerpts from the Programmer's Manual, 1971–1986 (PDF) (技術レポート). CSTR. Bell Labs. 139.
- ^ 「(stdio.h) - C++ リファレンス」。C++ 。 2021年7月25日閲覧。
- ^ – ベース定義リファレンス、The Single UNIX 仕様、バージョン 4、The Open Group
- ^ 「Sfio: 安全で高速な I/O ライブラリ」。2006 年 2 月 11 日時点のオリジナルよりアーカイブ。2021 年3 月 16 日閲覧。
{{cite web}}: CS1 maint: bot: original URL status unknown (link) - ^ Korn, David G. ; Vo, Kiem-Phong (1991). SFIO: 安全で高速な文字列/ファイル IO。Proc . Summer USENIX Conf. CiteSeerX 10.1.1.51.6574。
- ^ Fowler, Glenn S.; Korn, David G.; Vo, Kiem-Phong (2000). Sfio による拡張フォーマット。Proc. Summer USENIX Conf.
