假设您有一个 txt 文件,它当前包含重要的内容。目前内容是这样的
"I like blue cats and yellow dogs."
Run Code Online (Sandbox Code Playgroud)
但你想更新上述内容。
std::ofstream myFile;
myFile.open("file.txt");
myFile << "I like " << catColorStr << " cats and " << dogColorStr << " dogs.";
myFile.close();
Run Code Online (Sandbox Code Playgroud)
但是,假设由于某种原因,您的程序在第二行和第三行之间崩溃,或者可能是用户断电,或者他们在 Windows 任务管理器中使用了结束进程等。那么您刚刚删除了 file.txt 的全部内容。您通常如何考虑这一点?
处理此问题的典型方法是将其以只读方式打开,将内容复制到您的程序中。然后将其复制到新的临时文件或其他文件中。然后写入您的实际文件,如果成功删除您的临时文件,否则在启动时您会说您的实际文件=您的临时文件?
通常,您创建一个新文件,对其进行写入,关闭它,然后将新文件重命名为旧文件。
std::ofstream myFile;
myFile.open("file.txt.new");
myFile << "I like " << catColorStr << " cats and " << dogColorStr << " dogs.";
myFile.close();
sys::filesystem::rename("file.txt.new", "file.txt");
// or POSIX rename or Windows or...
Run Code Online (Sandbox Code Playgroud)
(为简洁起见,省略了错误检查)
重命名操作自动删除旧文件并为新文件提供旧名称。如果有人从中间拉电源线,这是操作系统的问题,而不是您的问题。现代操作系统非常擅长处理它。