【问题标题】:A way to overwrite few positions in file一种覆盖文件中几个位置的方法
【发布时间】:2015-10-02 06:55:30
【问题描述】:

我从文件中的某些位置正确读取了值,但是当我需要重写这些值时遇到了问题。在我的文件阅读器在所需位置找不到他需要的东西之后,这一切都搞砸了。有没有办法覆盖整行,并避免这些情况? 我正在使用 lseek() 函数将文件指针移动到我需要的位置。

【问题讨论】:

  • 对于配置(以及日志记录和时间测量)我很高兴使用 Sqlite3。将数据库用于此类任务有很大的好处,也没有什么缺点
  • 在我看来,最安全的方法是使用“旧的”方式:将文件加载到缓冲区,编辑,然后将缓冲区写回文件。
  • 您能否分享代码或告诉我们您是如何写回文件的。
  • 另外提一下是c还是c++还是两者都有,对用户回答你的问题很有帮助。

标签: c++ c configuration-files


【解决方案1】:

既然你说“行”,我假设你在谈论文本文件。

在这种情况下:不,没有办法覆盖单行,除了,如果您要写入的新行的长度完全相同

这是因为磁盘上的文件抽象不像在例如编辑文件那样工作。文本编辑器,如果不重写更改点之后的所有尾随数据,则无法在中间插入/删除。

一般来说,您需要在内存中构造更改并覆盖整个文件(或至少以更改开头的部分)。

【讨论】:

  • 问题是根据这些值而变化。文件中的长度从 19 到 21 个字节。是的,它是文本文件。
  • @Zola:unwind 所说的仍然是正确的......如果您最初可以将行填充到长度 21(例如,在末尾添加空格),那么您可以覆盖,否则您需要转移所有要创建或填充空间的文件内容(就像std::vectorstd::string)。
【解决方案2】:

你可以

  1. 读取要更改的行之后的尾部,并将其与更改一起写回,或者
  2. 求助于内存映射文件:您可以像使用 C 字符串一样进行更改,其余的由操作系统处理。

我更喜欢内存映射文件。当可移植性成为问题时,boost 为它们提供了可移植的抽象。在诉诸变体 1 之前,我会考虑这一点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-19
    • 2019-10-21
    • 2015-02-11
    相关资源
    最近更新 更多