【问题标题】:Copying binary file with C++ from an istream to an ostream not always correct使用 C++ 将二进制文件从 istream 复制到 ostream 并不总是正确的
【发布时间】:2017-08-08 22:38:00
【问题描述】:

我创建了一个 c++ 应用程序,它使用 poco 库 FTPclientsession 通过 ftp 下载二进制文件。为了计算下载进度,我使用以下代码逐字节将文件从 istream 复制到 ostream:

char c = 0;
    istream is;
    ostream os;
std::streamsize iter = 0;
is.get(c);
while (istr && ostr)
{
    ++iter;
    os.put(c);
    is.get(c);
}
return iter;

当我尝试下载一个 1MB 的文件时,该文件在 ftp 服务器中由 1048576 个字节组成(使用 stat 命令检查),大多数情况下,iter 永远不会达到这个数字,但从 1048573 到 1048575 的值会减少一到三个字节。 它很少达到正确的尺寸。我还检查了 is.fail() 并注意到测量不正确的情况下设置了故障位。
这是二进制文件的问题,与服务器的连接不良还是我的代码有问题?

【问题讨论】:

    标签: c++ ftp ostream istream


    【解决方案1】:

    确保以二进制模式打开输入和输出流,否则它将执行行尾转换,即根据平台将 ASCII 码 10 (\n) 替换为 { 13, 10 } (\r\n) .

    std::ofstream out("data.bin", std::ios::binary);
    

    在使用二进制流时,您也不应该使用格式化的输入和输出操作(即operator >>operator <<)。您已经在使用get()put(),应该没问题。

    【讨论】:

      猜你喜欢
      • 2011-05-03
      • 1970-01-01
      • 1970-01-01
      • 2019-06-18
      • 1970-01-01
      • 2016-03-13
      • 2021-12-24
      • 2015-02-15
      • 1970-01-01
      相关资源
      最近更新 更多