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

The best way to save data from std::istream to file

本文关键字:存到文件 最佳 方法 istream 数据 std      更新时间:2023-10-16

我在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到一个文件?

CRLF ("rn")输入序列,可以转换为简单的LF ("n")。在fwrite中有一个bug,代码试图写入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 &Ofstream的网址是http://www.cplusplus.com/reference/ostream/ostream/write/,可能对你有帮助。

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