读取1kB块中的文件并使用cstdio写入另一个文件

时间:2012-01-19 05:58:50

标签: c++ io

我试图编写一个简单的程序,以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上找到有关它的任何信息,我无法弄清楚如何在谷歌。我很感激你对此的看法。

2 个答案:

答案 0 :(得分:4)

size中您的countfread个参数错误地存在。如果您尝试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返回从文件读取的实际字节数(放入缓冲区)。利用它。