如何仅用std::filebuf以二进制模式写入文件?代码写入异常排查
为什么sputn返回有效写入数,但文件中没有数据?
这种情况我碰到过很多次,最常见的原因就是数据还停留在std::filebuf的内存缓冲区里,没有同步到磁盘。
std::filebuf会用内存缓冲区优化磁盘IO性能——只有当缓冲区被填满、你主动调用同步方法,或者文件被关闭/对象被销毁时,才会把缓冲区里的内容真正写入磁盘。如果你的代码写完数据后直接退出,而没有做同步或关闭操作,虽然sputn返回了预期的写入数,但数据可能还在内存里,没来得及写到文件中。
另外还要排查两个关键点:
- 文件是否成功打开:如果
open调用失败(比如没有写入权限、路径不存在),sputn其实不会写入任何数据,但它仍然会返回你传入的字节数,这时候文件自然是空的。所以一定要先判断open的返回值,不为nullptr才继续操作。 - 是否有异常或提前退出:如果程序在写完数据后因为异常或者其他逻辑提前终止,
std::filebuf的析构函数可能没来得及执行(局部对象正常退出时析构会自动关闭文件,但异常情况下不一定),导致数据没同步。
给你一个修正后的示例代码,解决这个问题:
#include <fstream> int main() { std::filebuf fileBuffer; // 先检查文件是否打开成功 if (!fileBuffer.open("test.bin", std::ios::out | std::ios::binary)) { // 这里可以加错误提示,比如打印"Failed to open file!" return 1; } const char testData[] = "This is binary test data"; std::streamsize bytesWritten = fileBuffer.sputn(testData, sizeof(testData) - 1); // 跳过末尾的'\0' // 主动同步缓冲区,确保数据写入磁盘 if (fileBuffer.pubsync() == -1) { // 同步失败的处理逻辑 return 1; } // 关闭文件(可选,因为局部对象销毁时会自动关闭,但显式关闭更稳妥) fileBuffer.close(); return 0; }
内容的提问来源于stack exchange,提问作者Buddhika Chaturanga
相关产品推荐
相关产品推荐

