我试图编写一个简单的程序,以1024字节为单位从文件(输入)读取数据,然后将数据写入另一个文件(输出)。该程序到目前为止工作,但我遇到的问题是,如果它到达文件的末尾,并且最后一次读取不是1024字节的块,那么它将输出剩余的垃圾数据。阵列。我使用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上找到有关它的任何信息,我无法弄清楚如何在谷歌。我很感激你对此的看法。
答案 0 :(得分:4)
size
中您的count
和fread
个参数错误地存在。如果您尝试fread
一个大小为1K的项目并且文件中只剩下15个字节,那么您将 nothing 并且文件将永远保持未读状态。也就是说,在您的fwrite
来电填满磁盘之前,然后就会知道它。
换句话说,你永远不会看到最后十五个字节。这是因为,虽然fread
会比你要求的更少元素,但它只会给你整个元素,而不是部分元素。
您需要做的是尝试读取1024个大小为1字节的项目(而不是1024字节的一项)。
fread
还会返回实际项目读取数量(如上所述,可能少于您要求的数量)和那你的内容应传递给fwrite
(a):
size_t bytCount;
while (! feof (fin)) {
bytCount = fread (block, 1, sizeof(block), fin);
fwrite (block, 1, bytCount, fout);
}
您会看到我也将幻数1024
更改为sizeof(block)
- 这样可以最大程度地减少缓冲区大小所需的源代码更改。
(a)如果您想要真正健壮,fwrite
也会返回写入的项目数,这可能会少于您的要求。完美的代码也可以检查这个条件。
答案 1 :(得分:0)
1024是您的缓冲区大小。 fread返回从文件读取的实际字节数(放入缓冲区)。利用它。