標準IOルーチン(printf()
およびなどscanf()
)は、バッファリングを使用してパフォーマンスを向上させ、いくつかの優れた標準化されたルーチン(fgets()
一度に1行ずつ読み取るなど)を提供します。関数呼び出しは通常、システム呼び出しよりも大幅に高速です。システムコールを使用して一度に1バイトのデータを読み取るアプリケーションを作成する場合、一度に1024バイト以上を読み取るアプリケーションよりも実行速度が大幅に低下します。
これはほとんどの場合素晴らしいことです。
しかし、それはあなたがあなたのアプリケーションを注意深く書く必要があることを意味します。read()
すべてのデータを一度に読み取る単一スタイルの関数を単純に発行することはできません。(使用可能なデータの量は、マシンで使用可能なメモリとスワップスペースの量よりも大幅に多い場合があるため、可能であっても、すべてのユースケースで信頼性が高いとは限りません。)
入力のストリームを処理するアプリケーションは、次のようなループを持つ傾向があります。
int c;
while ((c = getc()) != EOF) {
/* handle the character c */
}
また
char buffer[1024];
while (fgets(buffer, sizeof buffer, F)) {
/* handle buffer */
}
最初のケースは、2つ以上の「バッファー」にまたがる入力について心配する必要がないため便利です。ただし、最初のケースは意味がsscanf()
あり、同様のツールでは数値の解析に役立ちません。2番目のケースでは、解析時に使用できますがsscanf()
、入力が2つのバッファーにまたがる準備をする必要があります。バッファが8バイトしかない場合、これを見つけるのは簡単です。32バイトのMD5sum、または表現するのに8文字以上を必要とするbuffer[8]
aを読み込みたい場合: 。最初の読み取りでは最初の8バイトが取得され、2番目の読み取りでは次の2バイトが取得されるため、数値を作成する必要があります。double
1234567890