gpt4 book ai didi

c - fread() 读取过多数据

转载 作者:行者123 更新时间:2023-11-30 20:52:35 29 4
gpt4 key购买 nike

目前我正在尝试一次读取 16 个字节的二进制文件。这在文件结束之前都很好,无论文件是否结束,它都会读取完整的 16 个字节。我有一个写入“ABCDEFGHIJKLMNOPQRSTUV”的文件,在成功接收前 16 个字节后,它在第二遍读取“QRSTUVGHIJKLMNOP”。如何阻止它重新读取这些字节?这就是我目前所拥有的。它显然不会打印第二遍数据,因为 fread 不返回 16。我应该注意我必须一次读取 16 个字节。

#define BS 16
unsigned char buffer[BS]; // for storing each 16 bytes read
int i = 0; // for iterating through readbytes

while (fread(buffer, 1, sizeof(buffer), ifp) == BS) {
while (i < BS) {
printf("Read: %c\n",buffer[i]);
i++;
}
i = 0;
}

最佳答案

它不会重新读取字节GHI…NOP;它们仍然位于上次成功读取的缓冲区中。当fread()报告短读取,报告读取的数据之后的缓冲区内容是不确定的。您需要保存 fread() 的返回值 - 它是 size_t - 并使用它来指导您。它报告6个字节;之后访问任何内容都会导致未定义(未指定、不确定——通常是“不可取的”)行为。

您应该在外部 while 循环内定义 int i = 0;;那么在内循环之后就不需要尾随的 i = 0; 。或者甚至只是一个例程 for 循环,如 M.M commented .

因此:

#define BS 16
unsigned char buffer[BS];
size_t nbytes;

while ((nbytes = fread(buffer, 1, sizeof(buffer), ifp)) == BS)
{
for (size_t i = 0; i < BS; i++)
printf("Read: %c\n", buffer[i]);
}

printf("Short read (%zu bytes):\n", nbytes);
for (size_t i = 0; i < nbytes; i++)
printf("Short: %c\n", buffer[i]);

关于c - fread() 读取过多数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59889787/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com