使用fstream显式保存文件而不用C++关闭文件

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)

Bas*_*tch 5

文件通常是一些字节流,并且可能比虚拟地址空间大得多(例如,在只有几千兆字节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)写入内存,刷新该流,然后对其内存数据执行某些操作(例如,写入磁盘).