我创建了一个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;
当我尝试下载1MB的文件时,在ftp服务器中包含1048576个字节(使用stat命令检查),大多数时候iter永远不会达到这个数字,但是从1048573到1048575的值减去1到3个字节。登记/> 很少测量到正确的尺寸。我还检查了is.fail()并注意到测量不正确的情况下设置了failbit 这是二进制文件的问题,与服务器连接不良或我的代码有问题吗?
答案 0 :(得分:1)
确保以二进制模式打开输入和输出流,否则它将执行行结束转换,即用{13,10}替换ASCII代码10(\n
)(\r\n
)取决于平台。
std::ofstream out("data.bin", std::ios::binary);
使用二进制流时,您也不应使用格式化的输入和输出操作(即operator >>
和operator <<
)。您已经在使用get()
和put()
,因此应该没问题。