gpt4 book ai didi

c++ - 以 1kB block 读取文件并使用 cstdio 写入另一个文件

转载 作者:行者123 更新时间:2023-11-27 23:26:37 25 4
gpt4 key购买 nike

我正在尝试编写一个简单的程序,以 1024 字节为单位从文件(输入)读取数据,然后将数据写入另一个文件(输出)。该程序到目前为止工作,但我遇到的问题是,如果它到达文件末尾并且最后一次读取不是 1024 字节的整齐 block ,那么它将为数组的其余部分输出垃圾数据。我使用 fstream 函数可以很好地工作,但是当我使用 cstdio 函数(分配是使用 fread 和 fwrite)时,我就遇到了问题。到目前为止,这是我的代码:

#include <cstdio>
using namespace std;


int main()
{
FILE* fin;
FILE* fout;
char block[1024];


fin = fopen("input", "r");
fout = fopen("output", "w+");

while (!feof(fin))
{
fread(block,1024,1,fin);
fwrite(block,1,1024,fout);
}

fclose(fin);
fclose(fout);

return 0;
}

我确信这是一个简单的修复,但我似乎无法在 cplusplus.com 上找到任何关于它的信息,而且我无法弄清楚如何在谷歌上表达这个问题。感谢您对此的看法。

最佳答案

您的 sizecount 参数在 fread 中以错误的方式存在。如果您尝试fread 一个大小为 1K 的项目,而文件中只剩下 15 个字节,您将一无所获并且该文件将永远保持未读状态。也就是说,直到您的 fwrite 调用填满磁盘,然后您就会知道它。

换句话说,您将永远看不到最后十五个字节。这是因为,虽然 fread 会很高兴地为您提供比您要求的更少的元素,但它只会为您提供完整的元素,而不是部分元素。

您需要做的是尝试读取 1024 项,每项大小为一个字节(而不是一项 1024 字节)。

fread 还返回读取的实际 项目数(如上所述,可能少于您要求的数量)并且那是 你应该传递给 fwrite 的内容 (a):

size_t bytCount;
while (! feof (fin)) {
bytCount = fread (block, 1, sizeof(block), fin);
fwrite (block, 1, bytCount, fout);
}

您会看到我还将魔数(Magic Number) 1024 更改为 sizeof(block) - 如果您使用缓冲区,这将最大限度地减少所需的源代码更改大小。


(a) 如果您想变得真正健壮,fwrite 还会返回写入的项目数,这可能比您要求的要少。完美的代码也会检查这个条件。

关于c++ - 以 1kB block 读取文件并使用 cstdio 写入另一个文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8921695/

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