使用 C++ 将二进制文件从 istream 复制到 ostream 并不总是正确的

Copying binary file with C++ from an istream to an ostream not always correct

我创建了一个 c++ 应用程序,它使用 poco libary 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;

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

确保输入流和输出流都以二进制方式打开,否则会进行行尾转换,即将ASCII码10(\n)替换为{13, 10}(\r\n) 取决于平台。

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

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