【问题标题】:What is the best way to edit the middle of an existing flat file?编辑现有平面文件中间的最佳方法是什么?
【发布时间】:2010-10-18 11:06:40
【问题描述】:

我有为模拟创建变量的工具。当前的工作流程涉及将这些变量手动复制到模拟输入文件中。输入文件是标准平面文件,即不是二进制文件或 XML。我想自动将变量添加到平面输入文件中。

变量复制文件中的现有变量,例如

新变量: 长度 10 身高 20 深度 30

旧变量: ... 体重 100 20 岁 长度 10 身高 20 深度 30 ...

希望将旧变量复制到新变量上。它们是平面输入文件的 200 行。

感谢您的任何见解。

附:这是在 Windows 上。

【问题讨论】:

  • 我认为你最好重写整个文件。
  • @Mark,我同意 - 我认为“如何”重写文件是需要回答的问题。

标签: windows file edit flat


【解决方案1】:

请注意,在 Unix 下,可能会考虑使用 mmap(),因为您可以使用诸如 memmove() 之类的函数来移动数据并添加新数据,或者如果文件更小,则使用 truncate() 结果(您可能还想使用truncate() 来增大文件)。

在 MS-Windows 下,您可以使用 MapViewOfFileEx() 函数来做同样的事情。不过,API 不同, 而且我不完全确定会发生什么或如何扩大/缩小文件(MSDN 还包括类似truncate() 的功能,也许这有效)。

当然,正确使用memcpy()memmove() 很重要,以免覆盖错误数据或超出缓冲区。

【讨论】:

    【解决方案2】:

    对于这样的事情,我会看一个简单的template engine。您将拥有一个带有预定义标记标记而不是变量值的基本模板,然后只需将所需的值与模板一起传递给您的引擎,它就会吐出结果文件,所有文件都存在且正确。有许多Open Source template engines available in Java 可以满足您的需求,我想这些东西也可以用您选择的语言提供。你甚至可以毫不费力地自己滚动。

    【讨论】:

      【解决方案3】:

      如果您无法使用 flat,那么您将无法使用老式的更新方式:从原始文件读取、写入临时文件、写入原始行或更改数据然后再写入。要添加数据,请将其写入临时文件的适当位置;要删除数据,请不要从原始文件中复制它。

      最后,关闭这两个文件并将临时文件重命名为原始文件名。

      或者,是时候考虑一​​个小型数据库了。

      【讨论】:

      • 我采用了这种方法。我将文件读入一个临时变量,向下到文件中间,更改了我需要编辑的位,然后再次将文件写出。似乎工作正常,特别是因为我要替换整行而不是部分行。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多