2012-01-19 93 views
0

我试图编写一个简单的程序,以1024字节的块的形式从文件(输入)中读取数据,然后将数据写入另一个文件(输出)。该程序到目前为止工作,但我遇到的问题是,如果它到达文件的末尾,最后一次读取不是一个整洁的1024字节块,然后它输出数组的其余部分的垃圾数据。我已经使用fstream函数可以正常工作,但是当我使用cstdio函数(分配是使用fread和fwrite)是我遇到问题时。这里是我的代码迄今:读取1kB块中的文件并使用cstdio写入另一个文件

#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信息,我无法弄清楚如何字的问题在谷歌上。我很欣赏你对此的看法。

+1

为什么stdio代替流? (不是说它与你的bug有关) –

回答

4

fread中,您有您的sizecount参数错误。如果您尝试fread一个大小为1K的项目,并且文件中只剩下15个字节,那么您将得到没有任何内容并且该文件将永远保持未读状态。也就是说,直到你的fwrite调用填满磁盘,然后你就会知道它。

换句话说,你永远不会看到最后的十五个字节。这是因为,虽然fread会愉快地给你比你要求的更少的元素,它只会给你整个元素,而不是部分元素。

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

fread也返回项目的实际读取数量(其中,如上所述,可能会少于你问什么)和你应该传递给fwrite(一)什么:

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

你会看到我也改变了神奇的数字1024sizeof(block) - 这将最大限度地减少所需的源代码,如果你不断增加缓冲区大小。


(一)如果你想成为真正强大的,fwrite也返回书面的项目数,这可能会小于你问什么。完美的代码也会检查这种情况。

+0

非常感谢! – user1044845

0

1024是您的缓冲区大小。 fread返回从文件中读取的实际字节数(放入缓冲区)。利用它。

相关问题