使用一个由c++修改的未关闭的文本文件安全吗

is it safe to use a text file that is modified by c++ and is not closed?

本文关键字:文本 文件安全 修改 c++ 一个      更新时间:2023-10-16

标题不太清楚,但我的意思是:

std::fstream filestream("abc.dat", std::ios::out);
double write_to_file;
while (some_condition) {
    write_to_file = 1.345; ///this number will be different in each loop iteration
    filestream.seekg( 345 );
    filestream << std::setw(5) << write_to_file << std::flush;
    ///write the number to replace the number that is written in the previous iteration
    system( "./Some_app ./abc.dat" ); ///open an application in unix, 
    ////which uses "abc.dat" as the input file
}
filestream.close();

这是一个粗略的想法,每次迭代都将数字重新写入文件并刷新。我希望不要在每次迭代中打开和关闭文件,以节省计算时间。(也不确定打开和关闭的复杂性:/(这样做可以吗?

在unix上,std::flush不一定会写入物理设备。通常不会。std::ofstream::flush调用rdbuf->pubsync(),后者又调用rdbuf->sync(),后者又"将受控序列与数组同步"。这些"控制序列"是什么?通常,它们不是底层物理设备。在像unix这样的现代操作系统中,高级I/O结构之间有很多东西,比如C++的I/O缓冲区概念和设备上的位。

即使是低级POSIX函数fsync()也不一定保证比特被写入设备。即使关闭和重新打开输出文件也不一定能保证位被写入设备。


你可能需要重新考虑你的设计。

在调用system(但使用<< std::flush;(之前,您至少需要用filestream.flush()刷新C++流缓冲区

我假设./Someapp不是在写文件,而是只为读取而打开它。

但在您的情况下,最好在每次迭代时打开和关闭文件,因为system调用显然是一个巨大的瓶颈。