cod*_*ver 2 c++ fstream file ofstream c++11
WRT代码,我想明确 "保存"文件而不调用close().我知道没有必要调用close(),因为当fstream对象超出范围时,fsteam将调用析构函数并保存文件.
但我想"明确地"保存文件而不等待fstream对象超出范围.有没有办法在C++中执行此操作?有没有像
flHtmlFile.save()
Run Code Online (Sandbox Code Playgroud)
我知道的唯一选择是关闭它并再次打开?
#include <fstream>
int main()
{
std::ofstream flHtmlFile;
std::string fname = "some.txt";
flHtmlFile.open(fname);
flHtmlFile << "text1"; // gets written
flHtmlFile.close(); // My purpose is to EXPLICITLY SAVE THE FILE. Is there anything like flHtmlFile.save()
flHtmlFile << "text2"; // doesn't get written 'coz i called close()
return 1;
}
Run Code Online (Sandbox Code Playgroud)
文件通常是一些字节流,并且可能比虚拟地址空间大得多(例如,在只有几千兆字节RAM的机器上可以有一个TB级文件).
通常,程序不会将文件的所有内容保留在内存中.
有些库使您可以在内存中一次读取或写入所有内容(如果它适合那里!).例如,Qt有一个带有继承的readAll成员函数的QFile类.
但是,缓冲了文件流(FILE来自C标准库或std::ostream来自C++标准库).您可能想要刷新缓冲区.使用std :: flush(在C++中)或fflush(在C中); 它们实际上经常发出一些系统调用(可能在Linux上写(2))要求操作系统在某个文件中写入一些数据(但它们可能不保证数据已到达磁盘).
什么确切的情况是文件系统- ,经营系统-和特定于硬件.在Linux上,页面缓存可以在将数据写入磁盘之前保留数据(因此,如果计算机断电,数据可能会丢失).和磁盘控制器的硬件也有RAM和在某种程度上缓冲.另请参阅sync(2)和fsync(2)(甚至posix_fadvise(2) ...).因此,即使您刷新某些流,您也不确定这些字节是否永久写在磁盘上(您通常不关心).
(你的C++代码和真实硬件之间有很多层和大量的缓冲)
顺便说一下,您可以通过C++中的std :: ostringstream(或者POSIX上的C语言中的open_memstream)写入内存,刷新该流,然后对其内存数据执行某些操作(例如,将其写入磁盘).