我在std::istream
中有一些数据,我需要将其保存到磁盘。这是我的草稿:
std::istream& i_stream = ReceiveBytes();
FILE* pFile;
pFile = fopen("C:\\my_file.exe", "wb");
char buffer[1024] = {0x0};
i_stream.read(buffer, 1024);
std::streamsize n = i_stream.gcount();
while (n > 0)
{
if (i_stream)
{
fwrite(buffer, sizeof(char), sizeof(buffer), pFile);
i_stream.read(buffer, 1024);
n = i_stream.gcount();
}
else n = 0;
}
fclose(pFile);
出于某种原因,我没有保存i_stream
的所有数据,我在i_stream
的末尾丢失了大约50个字节。我在代码中做错了什么?有没有更好的解决方案将数据从std::istream
保存到文件?
答案 0 :(得分:2)
有两个可能的问题。首先是那个
您正在使用的std::istream
可能尚未以二进制形式打开
模式;你没告诉我们这个。第二个是你正在使用
无格式输入。如果您没有读取完整的1024
字节,
然后failbit
将设置在i_stream
中。测试
读取任何(甚至不够)字节
格式化的读取是i_stream || istream.gcount() != 0
(或用于
失败,!istream && istream.gcount() == 0
)。
答案 1 :(得分:2)
CRLF(“\ r \ n”)输入序列可能会转换为简单LF(“\ n”)。 fwrite中有一个错误,代码尝试写入1024字节,无论如何。 输出打开,写入或关闭时没有错误检查。
更惯用的是在while条件下进行一次输入测试:
std::streamsize n;
i_stream.read(buffer, 1024);
while (i_stream || (n = istream.gcount()) != 0) {
fwrite(buffer, sizeof(char), n, pFile);
if (n) { i_stream.read(buffer, 1024) };
}
通过混合使用C ++流和C stdio函数,代码与使用流读取和写入时的代码不太一致。使用ifstream&amp ;;复制二进制文件的代码示例ofstream在http://www.cplusplus.com/reference/ostream/ostream/write/给出,这可能会有所帮助。