【问题标题】:The best way to save data from std::istream to file将数据从 std::istream 保存到文件的最佳方法
【发布时间】:2014-07-12 23:05:43
【问题描述】:

我在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 保存到文件中?

【问题讨论】:

  • 在最后一次调用i_stream.read() 之后,if (i_stream) 可能会失败,所以最后的fwrite 不会被调用。
  • 另外,在fwrite 你应该写n 字节,而不是sizeof(buffer) 字节。

标签: c++ windows file stream


【解决方案1】:

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 函数,与使用流进行读取和写入相比,代码的一致性较差。 http://www.cplusplus.com/reference/ostream/ostream/write/ 给出了使用 ifstream 和 ofstream 复制二进制文件的代码示例,这可能会有所帮助。

【讨论】:

    【解决方案2】:

    有两个可能的问题。第一个是 std::istream 您使用的可能没有以二进制打开 模式;你没有给我们看这个。第二个是你正在使用 未格式化的输入。如果您没有阅读完整的1024 字节, 那么failbit 将设置在i_stream 中。测试为 已读取任何内容(甚至不足)字节 格式化读取是i_stream || istream.gcount() != 0(或 失败,!istream && istream.gcount() == 0)。

    【讨论】:

      猜你喜欢
      • 2012-02-07
      • 2012-06-19
      • 2019-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-08
      • 1970-01-01
      • 2016-01-01
      相关资源
      最近更新 更多