fread
の基本的な使用法は、あなたが読もうとした内容を読み取ることを検証するために期待されるバイト数と比較して戻り値をチェックします。リターンを保存すると、部分的な読み込みも処理できます。
以下の最小の例では、(ファイルが指定されていない場合、デフォルトで、またはstdin
)buf
に最初の引数として与えられたファイルから一度に16バイトを読み取り、次いで、HEX形式でstdout
に各値を出力します。
#include <stdio.h>
#define BUFSZ 16
int main (int argc, char **argv) {
unsigned char buf[BUFSZ] = {0};
size_t bytes = 0, i, readsz = sizeof buf;
FILE *fp = argc > 1 ? fopen (argv[1], "rb") : stdin;
if (!fp) {
fprintf (stderr, "error: file open failed '%s'.\n", argv[1]);
return 1;
}
/* read/output BUFSZ bytes at a time */
while ((bytes = fread (buf, sizeof *buf, readsz, fp)) == readsz) {
for (i = 0; i < readsz; i++)
printf (" 0x%02x", buf[i]);
putchar ('\n');
}
for (i = 0; i < bytes; i++) /* output final partial buf */
printf (" 0x%02x", buf[i]);
putchar ('\n');
if (fp != stdin)
fclose (fp);
return 0;
}
(注:fread
にsize
パラメータは1
のみbytes == readsz
リターンitems
リードの数であり、各項目はchar
タイプ値の1
にのみ等しくなる。)
使用例/出力
$ echo "A quick brown fox jumps over the lazy dog" | ./bin/fread_write_hex
0x41 0x20 0x71 0x75 0x69 0x63 0x6b 0x20 0x62 0x72 0x6f 0x77 0x6e 0x20 0x66 0x6f
0x78 0x20 0x6a 0x75 0x6d 0x70 0x73 0x20 0x6f 0x76 0x65 0x72 0x20 0x74 0x68 0x65
0x20 0x6c 0x61 0x7a 0x79 0x20 0x64 0x6f 0x67 0x0a
この例を見て、y何か質問があります。
*バイナリ*を読み込み、*文字列*形式指定子を使用して印刷しようとしています。バイナリデータがヌルバイトで始まるか、またはバイトがすべて印刷不能な値である場合、どの出力を期待しますか?あるいは、もしそれらのバイト*がヌルターミネータを含んでいないと 'printf'がどこで停止するのかを伝えないとどうなりますか? –
配列を繰り返し、配列の各値を数値として出力すると、拡張または制限されたASCII文字は解釈されず、整数値として解釈されるため、配列内の内容を確認するのに役立ちます。 – callyalater
ファイルの実際の内容は何ですか?スニペットを投稿できますか? –