将数据从std::istream保存到文件的最佳方法
The best way to save data from std::istream to file
我在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
到一个文件?
CRLF ("rn")输入序列,可以转换为简单的LF ("n")。在fwrite中有一个bug,代码试图写入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 &Ofstream的网址是http://www.cplusplus.com/reference/ostream/ostream/write/,可能对你有帮助。
有两个可能的问题。首先是您正在使用的std::istream
可能没有以二进制打开模式;你不给我们看这个。第二是你在吸毒无格式的输入。如果不读取全部1024
字节,那么failbit
将在i_stream
中设置。测试读取任何(甚至少于足够的)字节格式化的读取是i_stream || istream.gcount() != 0
(或for)失败,!istream && istream.gcount() == 0
)。
相关文章:
- 输入到文件并输出到另一个文件,并将流文件传递给函数
- 从函数角度看ID到文件路径的内部与外部映射
- 写入文件 a.txt,而终端重定向到文件 b.txt
- 如何使用 fprintf 将连续的 512 字节保存到文件中
- 看不到文件'SDL2.lib'
- 将字符串存储到文件下一行的变量中
- 将类型保存到文件
- 如何将包含另一个对象向量的对象保存到文件中,并使用C++中的二进制文件从文件中读回?
- C++ 生成文件未检测到 .h 文件中的更改
- 如何存储 unicode 字符并将其输出到文件?
- 将结构向量保存到文件中,并从C++文件中读取结构向量
- 将 clangd stderr 重定向到文件而不是控制台
- 如何将我的程序添加到文件和文件夹的macOS右键单击菜单?
- 是否可以将图像列表保存到文件中?
- 按下 QPushbutton 时将文本保存到文件
- 如何在C++中附加到文件?
- C++ ZBar cmake 错误"找不到文件"时包括
- C++以尽可能快的速度逐行将字符串保存到文件中
- LittleFS文件系统,NOR闪存的文件写入问题
- 将数据从std::istream保存到文件的最佳方法