Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用fstream显式保存文件,而不关闭C++;_C++_File_C++11_Fstream_Ofstream - Fatal编程技术网

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

C++ 使用fstream显式保存文件,而不关闭C++;,c++,file,c++11,fstream,ofstream,C++,File,C++11,Fstream,Ofstream,WRT代码,我想显式地保存文件,而不调用close()。我知道不需要调用close(),因为当fstream对象超出范围时,fsteam将调用析构函数并保存文件 但我想“明确地”保存文件,而不必等待fstream 对象将超出范围。有没有办法在C++中做到这一点? 有类似的吗 我知道的唯一一个选择是关闭它并再次打开 #include <fstream> int main() { std::ofstream flHtmlFile; std::string fname =

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

但我想“明确地”保存文件,而不必等待fstream 对象将超出范围。有没有办法在C++中做到这一点? 有类似的吗

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

#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;
}
#包括
int main()
{
std::流格式文件;
std::string fname=“some.txt”;
flHtmlFile.open(fname);

flHtmlFile如果您只想让您编写的内容尽快到达文件系统,请调用文件上的
flush

flHtmlFile.flush();

无需关闭或重新打开。

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

一般来说,程序不会将文件的所有内容都保存在内存中

有些库允许您在内存中一次读取或写入所有内容(如果适合的话!)。例如,有一个带有继承成员函数的类

<>但是,文件流(从C标准库中的<代码>文件>代码>或<代码> STD::OFSUCT从C++标准库中)被缓冲。您可能希望刷新缓冲区。使用(C++)或(C);实际上,通常会发出一些(可能在Linux上)请求操作系统在某些文件中写入一些数据。(但他们可能不能保证数据已经到达磁盘)

具体情况是文件系统、操作系统和硬件特定的。在Linux上,可能会在数据写入磁盘之前保留数据(因此,如果计算机断电,数据可能会丢失)。硬件也有RAM,并以某种方式进行缓冲。另请参阅和(甚至…)因此,即使您刷新一些流,您也不确定字节是否永久写入磁盘(通常您并不关心)

<>(C++代码与真实硬件之间有很多层和缓冲区)


BTW,你可以通过C++(或者在C上在POSIX上)写入内存,刷新流,然后用它的内存数据做一些事情(例如它到磁盘)。< /P>你想冲向文件吗?@ Co:你为什么问?请编辑你的问题来激励它!(给出更多的细节:什么操作系统,什么C++编译器和C++和C标准库,什么文件系统,什么应用)?它是多么重要的避免丢失数据(你的系统是一个危及生命的实时关键嵌入式系统,像在飞机或核电厂)?如果没有额外的动机,问题仍然不清楚。回答很好;补充很小:1.在数据写入磁盘之前,这不一定会阻塞。2.

std::endl
追加换行符并刷新。根据您的使用情况,这可能会减少调用flush()的需要方法.3.如果你喜欢语法而不是方法调用,你也可以使用
std::flush
(类似于
std::endl
),但在这一点上,我宁愿投票支持Basile的答案,并鼓励OP接受它。谢谢。好奇“flHtmlFile.flush();”之间有什么区别正如StoryTeller suggessted&std::flush()?这是最有利于性能的。我不知道,而且我相信你真的不应该在意(我仍然不明白是什么激发了你的问题)。如果性能是这样一个问题,你需要进行基准测试。
flHtmlFile.flush();