C言語の標準入出力

本記事C言語の標準入出力（シーげんごのひょうじゅんにゅうしゅつりょく）では、C言語で提供される、ファイル入出力用の、標準Cライブラリヘッダ の大部分を構成する標準Cライブラリ関数について述べる。これらの機能は、1970年代初頭にベル研究所のによって書かれた、「ポータブルI/Oパッケージ」に由来し、正式にVersion 7 UnixでUnixオペレーティングシステムの一部になった。
C言語の標準入出力機能は、現代使われるプログラミング言語の中ではかなり貧弱であり、すべてのファイル操作をバイトストリーム (「入力ストリーム」あるいは「出力ストリーム」) の操作に抽象化する。C言語以前のプログラミング言語とは異なり、C言語はランダムアクセスを直接サポートしていない。ファイルの途中から読み取るには、プログラマは、ストリームを作成し、ファイルの途中へシークし、ストリームからバイトを順番に読み取らなければならない。
ファイル入出力のストリームモデルは、C言語とほぼ同時に開発されたUnixによって普及した。最近のオペレーティングシステムの大部分はUnixのストリームモデルを継承している。また、C言語の影響を受けた多くの言語はC言語のファイル入出力インターフェイスを継承しており、差異はほぼ存在しない (例: PHP)。
概要.
C言語の標準入出力機能は、ストリームと呼ばれるオブジェクトを使用して、キーボード、プリンタ、端末などの物理デバイス、またはシステムでサポートされている他の種類のファイルを操作する。ストリームは、これらのデバイスを
同じ操作で操作するための抽象化に利用される。すなわち、すべてのストリームは、関連付けられている物理デバイスの差異に関係なく、同様のプロパティを持つ。
関数.
ほとんどのC言語入出力関数は、 (または、C++の場合 上の 名前空間) に定義されている。
定数.
 で定義されている定数は次の通りである。
変数.
 で定義されている変数は次の通りである。
データ型.
 で定義されているデータ型は次の通りである。
拡張機能.
POSIX標準では、 に拡張を定義している。それによって、 関数を使用してメモリを自動で割り当てること、 関数と 関数を使用して、 型とファイル記述子を接続すること、メモリ上を参照するFILE型の参照を作成することが可能になる。
例.
以下のCプログラムでは、 "hogefile" というバイナリファイルを開き、5バイト読み取り、ファイルを閉じている。
int main(void) {
 char buffer[5];
 FILE* fp = fopen("hogefile", "rb");
 if (fp == NULL) {
 perror("\"hogefile\"を開けませんでした。");
 return EXIT_FAILURE;
 for (int i = 0; i < 5; i++) {
 int rc = getc(fp);
 if (rc == EOF) {
 fputs("ファイルの読み取り中にエラーが発生しました。\n", stderr);
 return EXIT_FAILURE;
 
 buffer[i] = rc;
 fclose(fp);
 printf("読み取ったバイト列: %x %x %x %x %x\n", buffer[0], buffer[1],
 buffer[2], buffer[3], buffer[4]);
 return EXIT_SUCCESS;
stdioの代替.
 の代替がいくつか開発されている。これらの中には、ISO C++標準の一部である ライブラリがある。
他には、ベル研究所が開発しているSfio (Safe-fast / string-file I/O) ライブラリがある。1991年に開発されたこのライブラリは、 の設計における矛盾、危険な慣行、非効率性を回避することを目的にしている。特徴として、コールバック関数を導入してストリームに対して読み書きを行い、より柔軟にデータ処理を行うことを可能とすることが挙げられる。1997年に外部に公開された。