我创建了一个使用 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()
,所以应该没问题。