将数据从std :: istream保存到文件的最佳方法

时间:2014-05-23 14:24:10

标签: c++ windows file stream

我在std::istream中有一些数据,我需要将其保存到磁盘。这是我的草稿:

    std::istream& i_stream = ReceiveBytes();

    FILE* pFile;
    pFile = fopen("C:\\my_file.exe", "wb");
    char buffer[1024] = {0x0};
    i_stream.read(buffer, 1024);
    std::streamsize n = i_stream.gcount();

    while (n > 0)
    {  
        if (i_stream)
        {
            fwrite(buffer, sizeof(char), sizeof(buffer), pFile);
            i_stream.read(buffer, 1024);
            n = i_stream.gcount();
        }
        else n = 0;
    }

    fclose(pFile);

出于某种原因,我没有保存i_stream的所有数据,我在i_stream的末尾丢失了大约50个字节。我在代码中做错了什么?有没有更好的解决方案将数据从std::istream保存到文件?

2 个答案:

答案 0 :(得分:2)

有两个可能的问题。首先是那个 您正在使用的std::istream可能尚未以二进制形式打开 模式;你没告诉我们这个。第二个是你正在使用 无格式输入。如果您没有读取完整的1024字节, 然后failbit将设置在i_stream中。测试 读取任何(甚至不够)字节 格式化的读取是i_stream || istream.gcount() != 0(或用于 失败,!istream && istream.gcount() == 0)。

答案 1 :(得分:2)

CRLF(“\ r \ n”)输入序列可能会转换为简单LF(“\ n”)。 fwrite中有一个错误,代码尝试写入1024字节,无论如何。 输出打开,写入或关闭时没有错误检查。

更惯用的是在while条件下进行一次输入测试:

std::streamsize n;
i_stream.read(buffer, 1024);
while (i_stream || (n = istream.gcount()) != 0) {
    fwrite(buffer, sizeof(char), n, pFile);
    if (n) { i_stream.read(buffer, 1024) };
}

通过混合使用C ++流和C stdio函数,代码与使用流读取和写入时的代码不太一致。使用ifstream&amp ;;复制二进制文件的代码示例ofstream在http://www.cplusplus.com/reference/ostream/ostream/write/给出,这可能会有所帮助。