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

时间:2017-03-17 11:28:17

标签: c++ ftp ostream istream

我创建了一个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 这是二进制文件的问题,与服务器连接不良或我的代码有问题吗?

1 个答案:

答案 0 :(得分:1)

确保以二进制模式打开输入和输出流,否则它将执行行结束转换,即用{13,10}替换ASCII代码10(\n)(\r\n)取决于平台。

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

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