在输出文件中的两点之间移动

时间:2009-07-17 16:45:25

标签: c

我正在编写一个生成大型输出文件的C程序。为了提高可读性,我想在文件中的某些点收集某些类型的输出,而不是随机散布。

考虑如下文件:

log
log
(a)

output
output
output(b)

假设程序当前正在写(b)行。在C中是否有一种特别优雅的方式来实现移动到点(a)的效果,在(b)处添加线路输出然后恢复正常输出?

我知道我可以使用标准shell工具(例如csplit)在指定点打破文件,将输出附加到前半部分,然后将其重新绑定在一起,从而实现此效果。但是,此应用程序必须是跨平台的,因此我不能指望有可用的shell。

任何建议都会有所帮助!

5 个答案:

答案 0 :(得分:6)

在单个文件中执行您所描述的内容的唯一方法是预先保留“log”条目所需的所有空间,我猜你不能这样做,因为你不知道他们会变得多大。

您不能只是插入文件,向上移动插入点上方的内容以腾出空间。这不是通用文件系统支持的概念。您需要物理读取和重写所有“输出”部分,以便插入“日志”部分,随着文件的增长,这将需要越来越多的工作。

你最好的选择是写两个单独的文件,然后在最后加入它们。

在Sharpie评论之后

编辑:由于输出是程序的一组命令,这是否意味着您可以安全地假设它不会超过几MB的大,并且只需在内存中构建它,然后一次性写出来吗?

答案 1 :(得分:4)

你不能直接这样做,原因很简单:

无法在文件中间插入字节。您只能覆盖一个文件或追加到文件的末尾。

如果要插入文件的中间,有两个选项:

  • 读取要插入内存的位置之后的所有字节。然后编写要插入的部分,然后将缓存的所有字节写入内存。结果将是字节插入给定位置,代价是任意大的内存块来保存你必须“推回”的部分。
  • 或者,您将所有内容写入新文件。将源文件中的字节复制到新文件中。如果您想要插入新数据,请编写新行。然后继续从原始文件复制,直到完成为止。这可以在不需要大量内存的情况下工作,但需要使用临时文件来存储组合结果。

...

  • 或者,也可以不要将输出直接写入文件,而是将所有内容保存在内存中,并在收集完日志行后将其写入输出文件。

答案 2 :(得分:2)

这是一个非常不寻常的要求。

一种方法是为这两种字符串添加区分字符串 输出行,然后将它们写入同一个文件。如果您想在组合文件中为它们提供一组特定的输出 grep

  

... output.txt的
  MARK1:日志
  MARK2:输出
  MARK1:日志
  MARK2:输出
  MARK2:输出

grep "^MARK1:" output.txt
grep "^MARK2:" output.txt

您最终将需要该文件,因为您希望它被写入 为此,您需要切断前缀字符串 那时,如果你使用与简单的正则表达式相匹配的字符串,那将非常容易 像,

sed 's/^MARK.://g' output.txt > filtered.txt

答案 3 :(得分:0)

使用fgetpos,您可以存储指向文件中某个位置的指针,并随时使用fseek跳转到该位置:

答案 4 :(得分:0)

C或C ++?如果是C ++,可以使用seekp()来定位输出指针。但这只会让你覆盖。