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

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

本文关键字:ostream 复制 C++ 二进制文件 istream      更新时间:2023-10-16

我创建了一个使用 poco 库 FTPclientsession 通过 ftp 下载二进制文件的 c++ 应用程序。为了计算下载进度,我使用以下代码将文件从 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((,并注意到在测量不正确的情况下设置了failbit。
这是二进制文件的问题,与服务器的连接不良还是我的代码问题?

确保在二进制模式下同时打开输入和输出流,否则它将执行行端转换,即根据平台将 ASCII 代码 10 ( n ( 替换为 { 13, 10 } ( rn (。

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

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