fread
的基本用法将检查返回与期望验证您读取您想要读取的内容的字节数的关系。保存返回值还可以处理部分读取操作。
以下最小示例在从给定的作为第一个参数(或stdin
如果没有给出文件默认情况下)的文件中的时间到buf
读取16个字节,然后输出以十六进制格式的每个值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;
}
(注意:bytes == readsz
只有当size
参数fread
是1
回报是items
读取的数目和每个项目是只等于1
为char
类型的值。)
实施例利用/输出
$ 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你有任何问题。
您正在尝试读取* binary *,然后使用* string *格式说明符进行打印。如果该二进制数据以空字节开始或字节都是不可打印的值,您会期望什么输出?或者,如果这些字节*不包含空终止符来告诉'printf'它停在哪里,会发生什么? –
遍历数组并将每个数组值打印为数字应该可以帮助您查看数组中的内容,因为它不会解释扩展或限制的ASCII字符,而是将其解释为整数值。 – callyalater
该文件的实际内容是什么?你能发布一个片段吗? –