我试图编写的程序应该定义一些常量(C宏/常量)。所以我写了两个C程序:
hashgen
:这会从输入文件中生成常量。loopy
:执行带有一些文件名的hashgen
。以下是我执行loopy
:
./loopy *.txt >> constants.h
循环代码段位于
之下int main(int argc, char** argv) {
char buf[256];
puts("#ifndef CONSTS_DEFINED\n#define CONSTS_DEFINED");
while(--argc > 0) {
sprintf(buf, "./hashgen %s", argv[argc]);
system(buf);
}
puts("#endif");
return 0;
}
执行上述脚本后,当#ifndef ....
行存在时,#endif
行丢失。为什么孩子会覆盖父母的输出?
我同意有更好的方法,但那时需要这样做。现在我想知道为什么会这样。 :)
答案 0 :(得分:2)
puts的输出不会直接转到文件,而是转到内部缓冲区。因此,当调用外部程序时,尚未输出任何内容。程序输出它的东西,然后主程序继续,当它完成时,它的stdio缓冲区被刷新,你的指令最后结束。这也出现在普通重定向中,不仅仅是追加。
解决方案是在调用执行I / O的外部程序之前使用fflush(stdout)。