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

时间:2017-09-14 07:36:38

标签: c++ file c++11 fstream ofstream

WRT代码,我想显式“保存”文件而不调用close()。我知道没有必要调用close(),因为当fstream对象超出范围时,fsteam将调用析构函数并保存文件。

  

但我希望“明确地”保存文件而无需等待fstream   对象超出范围。有没有办法在C ++中执行此操作?   有什么像

flHtmlFile.save()

我知道的唯一选择是关闭它&再打开一次?

#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;
}

2 个答案:

答案 0 :(得分:5)

文件通常是一些字节流,并且可能比虚拟地址空间大得多(例如,在只有几千兆字节RAM的机器上,您可以拥有一个TB级文件)。

通常,程序不会将文件的所有内容保留在内存中。

一些库使您能够在内存中一次读取或写入所有内容(如果它适合那里!)。例如。 Qt有一个QFile类,其中包含一个继承的readAll成员函数。

但是,缓冲了文件流(来自C标准库的FILE或来自C ++标准库的std::ostream。您可能想要刷新缓冲区。使用std::flush(在C ++中)或fflush(在C中);他们几乎经常在Linux上发出一些system calls(可能是write(2))来要求操作系统在某个文件中写入一些数据(但他们可能不保证数据已经到达磁盘)。 / p>

完全发生的是文件系统,操作系统和特定于硬件。在Linux上,page cache可能会在数据写入磁盘之前保留数据(因此,如果计算机断电,数据可能会丢失)。 disk controller硬件也有RAM,并以某种方式缓冲。另请参阅sync(2)fsync(2)(甚至posix_fadvise(2) ...)。因此,即使您刷新某些流,您也不确定这些字节是否永久写在磁盘上(并且您通常不关心)。

(在您的C ++代码和真实硬件之间有多层大量缓冲

BTW你可以通过C ++中的std::ostringstream(或者POSIX上的C中的open_memstream)写入内存,刷新该流,然后对其内存数据做一些事情(例如write(2)到它磁盘)。

答案 1 :(得分:2)

如果你想要的只是你写的内容尽快到达文件系统,那么请在文件上调用flush

flHtmlFile.flush();

不需要关闭或重新开放。