使用 C++ 将二进制文件从 istream 复制到 ostream 并不总是正确的
Copying binary file with C++ from an istream to an ostream not always correct
我创建了一个 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;
当我尝试下载 ftp 服务器中包含 1048576 字节的 1MB 文件时(使用 stat 命令检查),大多数情况下 iter 永远不会达到这个数字但值会减少一到三个字节从 1048573 到 1048575.
它很少能达到正确的尺寸。我还检查了 is.fail() 并注意到在测量不正确的情况下设置了故障位。
这是二进制文件的问题,与服务器的连接不良还是我的代码有问题?
确保输入流和输出流都以二进制方式打开,否则会进行行尾转换,即将ASCII码10(\n
)替换为{13, 10}(\r\n
) 取决于平台。
std::ofstream out("data.bin", std::ios::binary);
在使用二进制流时,您也不应该使用格式化的输入和输出操作(即 operator >>
和 operator <<
)。您已经在使用 get()
和 put()
,所以应该没问题。
我创建了一个 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;
当我尝试下载 ftp 服务器中包含 1048576 字节的 1MB 文件时(使用 stat 命令检查),大多数情况下 iter 永远不会达到这个数字但值会减少一到三个字节从 1048573 到 1048575.
它很少能达到正确的尺寸。我还检查了 is.fail() 并注意到在测量不正确的情况下设置了故障位。
这是二进制文件的问题,与服务器的连接不良还是我的代码有问题?
确保输入流和输出流都以二进制方式打开,否则会进行行尾转换,即将ASCII码10(\n
)替换为{13, 10}(\r\n
) 取决于平台。
std::ofstream out("data.bin", std::ios::binary);
在使用二进制流时,您也不应该使用格式化的输入和输出操作(即 operator >>
和 operator <<
)。您已经在使用 get()
和 put()
,所以应该没问题。