我写了一个程序,它以文件名作为参数,打开文件,解析其内容并做一些事情。我正在编写一个测试程序,通过执行它来测试该程序。
这是我的测试类:
int main () {
FILE *input;
input = fopen("file.txt", "w+");
if (input == NULL) {
fprintf(stderr, "Unable to create a new file");
exit(1);
}
fprintf(input, "8\n");
if (execl("./a.out", "./a.out", "file.txt", NULL) == -1) {
fprintf(stderr, "Error forking program\n");
exit(1);
}
return 0;
}
当我打开file.txt
时,我只看到一个空白文件。我的./a.out
程序发出了一个解析错误(fgets
正在返回NULL),我认为它是因为file.txt
没有被写入。这有什么问题?我该如何调试这样的问题?为什么fprintf
不会写入文件?
谢谢,
答案 0 :(得分:3)
您需要刷新文件 - 请参阅fflush。在POSIX系统上,如果要在每个printf上刷新,也可以使用setbuf或setvbuf。
编辑:实际上,在你的代码中,适当的做法就是在execl之前复制文件;那当然是冲了它。此外,您不需要“w +”,而“输入”对于您正在写入的文件来说不是一个非常好的名称。
此外,您应该恰当地命名您的程序,而不是将它们命名为a.out;执行a.out特别危险,因为您不知道正在运行哪个程序。如果您在没有-o标志的情况下编译上述程序,它将覆盖a.out并调用它将导致自身的递归执行,从而导致无限循环。幸运的是,它不会使您的系统充满进程,因为您没有执行fork,与您的(错误的)错误消息相反。
尼克:不要忘记用\ n来结束你的printfs ...第一个缺乏。在错误消息中特别谨慎,这些消息没有得到彻底的测试。
答案 1 :(得分:1)
你想要什么没有明确指定。但我认为你使用./a.out这个程序的相同图像。然后
第一个问题您没有安排命令行参数。
第二个问题您使用
fopen("test.txt","w+");
//打开文件(如果存在)并截断它。如果不存在则创建它
这就是它总是一个新文件。没有以前的内容可用。如果你想要以前的文件内容,那么使用
fopen("test.txt","a");
要从文件中读取,也请使用
fopen("test.txt", "a+");
使用rewind()
时,您还必须在文件上调用a+
,该文件已存在。
第三个问题你用另一个图像替换当前图像,所以像递归一样工作。没有正确关闭文件,所以有些超时放缓冲没有正确刷新。
这就像无限循环一样。那么它的用途是什么我不建议这个程序要做。