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