【问题标题】:Edit an existing file in C++在 C++ 中编辑现有文件
【发布时间】:2013-03-21 11:53:40
【问题描述】:

我在 Qt 中有我的应用程序的首选项文件。 每当我启动应用程序时,它都会加载文件并根据内容相应地创建小部件。我为用户提供了一些自定义选项。现在,当我的应用程序关闭时,我正在检查首选项是否已更改。如果是,那么我将再次打开首选项文件,然后再次在其中添加所有内容。我不是在创建临时文件,而是直接编辑文件。这种方法有效吗?还是我做错了?因为我发现了这些线程: 1.What is the best way to edit the middle of an existing flat file?

  1. http://qt-project.org/forums/viewthread/25924/

应该使用二进制文件吗?目前我正在使用 ASCII 文件。 谢谢。

更新:在上面的stackoverflow链接中正确答案有

如果您不习惯使用 flat,那么您就会不习惯使用老式 更新方式

我的意思是问我使用的方法是否是老式的,现在有没有更好的方法? & 平面文件是什么意思?

【问题讨论】:

    标签: c++ file


    【解决方案1】:
    1. 不要尝试编辑文件。重写整个事情
    2. 使用临时文件重写。即将首选项的当前状态写入临时文件。然后在确保临时文件已成功写入后,将文件移动/重命名为您的实际首选项文件。这有助于在您重写文件时发生崩溃。如果你直接重写它,你将既没有旧的,也没有好的新的。如果您通过临时文件执行此操作,那么以这种方式执行此操作可确保在发生崩溃时,您至少有一个良好的首选项文件(尽管它包含旧的首选项)。
    3. 文本/二进制文件没有太大区别,除非它是一个非常大的文件。如果需要,文本将有助于手动编辑。

    【讨论】:

    • 或多或少很明显,但是...在擦除旧文件并重命名新文件之前,不要忘记确保新写入的文件已成功写入。 (只需检查 关闭后的状态。)
    • 不要删除旧文件,因为跟踪文件的软件会收到旧的删除/新通知而不是更改通知。将旧文件复制到某处,然后覆盖现有文件。
    • @RedX 什么软件跟踪文件。我一直使用删除,然后移动,唯一一次我遇到任何问题是当文件有几个硬链接时。 (但那是很久以前的事了。没有人再使用硬链接了。)
    • 例如 C# 或 windows FileChangeNotification 可能会失败。 (没有提到操作系统)
    • @RedX 所以?谁使用它们,用于什么目的? (正如我所说,我在 Unix 和 Windows 下都做过很多这样的事情,而且我从来没有遇到过问题。)
    【解决方案2】:

    这是一个非常好的方法。由于您似乎已经将所有首选项加载到内存中并且在那里进行了编辑,因此您无需为临时文件而烦恼(除非您想确保程序在写入过程中失败时的安全性)。只需将所有首选项写回原始文件即可。

    选择二进制文件还是文本文件取决于您。首选项往往是文本文件,因为它们具有仅使用文本编辑器而不是一些用于查看它们的专用软件的人类可读的额外好处。但是,由于解码更简单,二进制文件的性能可能稍好一些。

    【讨论】:

    • 您仍然需要临时文件,否则您很容易丢失数据。
    • @JamesKanze 我同意。我的意思是他们不需要像链接答案所暗示的那样需要临时文件,因为这只是因为他们在编写文件的同时解析文件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-23
    • 1970-01-01
    • 1970-01-01
    • 2015-08-29
    • 1970-01-01
    相关资源
    最近更新 更多