1 バイト、または eof まで読み取ることができます。
char buffer[32]; // Very long number!
if (NULL == (fp = fopen(FILENAME, "rb")))
{
// TODO: return a suitable error/perror
return -1;
}
bytesread = fread(buffer, sizeof(char), sizeof(buffer)-1, fp);
fclose(fp);
if (!bytesread)
{
// Nothing at all was read
// TODO: return error
return -2;
}
// This is in case you want the byte interpreted from ASCII
// otherwise you'd just return buffer[0], or (*(DATATYPE *)buffer)[0].
buffer[bytesread] = 0x0;
return atol(buffer);
多くのハードウェア デバイスがブロッキング データ チャネルを実装するという点で、このコードは実際にはそれほど一般的ではありません。つまり、そこにあるよりも多くのデータを読み込もうとすると、データが利用可能になるまで fread がブロックされます。このような場合は、バッファを必要な最大バイト数に 1 を加えたサイズにします。
プラス 1 とそれに対応する fread の -1 は、読み取ったデータが ASCII としてレンダリングされる場合にのみ存在します。つまり、「128」は 3 つの ASCII バイト「1」、「2」、「8」です。バイナリの 0x80 の代わりにキャリッジ リターンを使用することもできます。この場合、バッファーは、atol が操作して 10 進数を取得できる C 文字列にするためにゼロで終了します。
必要なものがバイナリ値である場合、そのような変換は必要なく、調整なしで完全なバッファーを読み取ることができ、最後のプラス 1 バイトをゼロに設定することを避け、バッファーからキャスト値を返すだけです。または、1 バイトだけが必要な場合は buffer[0]。