我正在编写一个生成大型输出文件的C程序。为了提高可读性,我想在文件中的某些点收集某些类型的输出,而不是随机散布。
考虑如下文件:
log
log
(a)
output
output
output(b)
假设程序当前正在写(b)行。在C中是否有一种特别优雅的方式来实现移动到点(a)的效果,在(b)处添加线路输出然后恢复正常输出?
我知道我可以使用标准shell工具(例如csplit)在指定点打破文件,将输出附加到前半部分,然后将其重新绑定在一起,从而实现此效果。但是,此应用程序必须是跨平台的,因此我不能指望有可用的shell。
任何建议都会有所帮助!
答案 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)
答案 4 :(得分:0)
C或C ++?如果是C ++,可以使用seekp()来定位输出指针。但这只会让你覆盖。