将带有C++的二进制文件从 istream 复制到 ostream 并不总是正确的
Copying binary file with C++ from an istream to an ostream not always correct
我创建了一个使用 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()
,所以应该没问题。
相关文章:
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- 使用strcpy将char数组的元素复制到另一个数组
- 是否可以初始化不可复制类型的成员变量(或基类)
- 为什么在C++中使用私有复制构造函数与删除复制构造函数
- C++ Windows 驱动程序MSB3030无法复制该文件,因为它找不到
- 复制列表初始化的隐式转换的等级是多少
- ostream过载时的缓冲区冲洗
- 当从函数参数中的临时值调用复制构造函数时
- 有可能在Armadillo中复制MATLAB circshift方法吗
- 复制几乎为空的数组的最快方法
- 需要从 istream 和 ostream 派生 iostream
- 以下示例中如何避免代码复制?C++/库达
- 如果有一个模板构造函数只有一个泛型参数,为什么我必须有一个复制构造函数
- 为什么需要复制构造函数,在哪些情况下它们非常有用
- 将带有C++的二进制文件从 istream 复制到 ostream 并不总是正确的
- 在不复制的情况下从Ostream中获取char*
- C++ 多项式复制构造函数和 ostream 覆盖导致模因泄漏?
- 将ostream复制到std::字符串
- 将ostream的内容复制到另一个ostream