【问题标题】:fread binary file truncates datafread 二进制文件截断数据
【发布时间】:2021-05-04 16:03:51
【问题描述】:

我有一个文件是由与我的代码在同一台 PC 上的应用程序创建的。这在开头有以下内容:

$ od -c save.data
0000000  \0  \0  \0 006  \0  \0  \0      \0   D  \0   V  \0   E  \0   1
.
.

在C中使用以下代码读取文件:

FILE *encfile;
char inba[8192];  // input file is < 500 bytes so this is plenty big enough

memset(inba, 0, sizeof(inba));
encfile = fopen(argv[1], "rb");
int br = fread(inba, 1, 8192, encfile);
printf ("Bytes read: %d\n", br);

上面正确打印Bytes read: 409

问题在于inba 变量为“空”,因为我认为读取的第一个字节是0,它被视为字符串的结尾。文件中有许多0 值字节。

如何让 C 将其视为 409 字节数组?

数据将作为char * 变量传递给其他函数。

这是字节序问题吗?

【问题讨论】:

  • 您的问题似乎在于“其他功能”的使用,而不是似乎工作正常的fread

标签: c binaryfiles fread


【解决方案1】:

二进制数据通常不是字符串。自己跟踪大小。

此代码将以十六进制转储数组的内容:

// br and inba are the variable in OP's code

for (int i = 0; i < br; i++) {
    printf("%02X", (unsigned char)inba[i]);
    if (i + 1 >= br || i % 16 == 15) putchar('\n'); else putchar(' ');
}

【讨论】:

  • 循环很好,但在第 409 个字符之后不会有换行符。修复很繁琐;你需要i在循环外可见,这样你就可以在循环之后使用if (i % 16 != 0) putchar('\n');——如果输出必须以换行符结尾。
  • @JonathanLeffler 好点,但我认为i 不应该在循环之外可见。
  • 这个答案很好地说明了这一点,是的,我现在可以看到所有数据都正确加载到数组中。
  • 我想你可以使用if (br % 16 != 0) putchar('\n');,因为它是一个纯计数循环。
猜你喜欢
  • 2021-05-24
  • 1970-01-01
  • 2020-06-09
  • 2011-09-02
  • 1970-01-01
  • 2013-12-29
  • 2015-08-22
  • 2019-04-13
  • 1970-01-01
相关资源
最近更新 更多