0

我写了一个程序,它以文件名作为参数,打开文件,解析它的内容并做一些事情。我正在编写一个测试程序,它将通过执行它来测试该程序。

这是我的测试课:

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永远不会写入文件?

谢谢,

4

2 回答 2

3

您需要刷新文件 - 请参阅 fflush。在 POSIX 系统上,如果您想在每个 printf 上刷新,也可以使用 setbuf 或 setvbuf。

编辑:实际上,在您的代码中,适当的做法是在 execl 之前关闭文件;这当然会冲洗它。此外,您不需要“w+”,并且“input”对于您正在写入的文件来说不是一个很好的名称。

此外,您应该适当地命名您的程序,而不是将它们命名为 a.out;a.out 的 execl 特别危险,因为您不知道正在运行哪个程序。如果你在没有 -o 标志的情况下编译上面的程序,它会覆盖 a.out 并调用它会导致自身递归执行,从而导致无限循环。幸运的是,它不会因为您不执行分叉而使您的系统充满进程,这与您的(错误的)错误消息相反。

尼特:不要忘记用 \n 结束你的 printfs ...缺少第一个。在错误消息中要特别谨慎,因为它没有得到彻底的测试。

于 2012-07-28T00:33:57.253 回答
1

你想要什么没有明确指定。但我认为你使用 ./a.out 是这个程序的相同图像。然后

第一个问题是你没有命令行参数的安排。

第二个问题是你用

fopen("test.txt","w+");

//如果存在则打开文件并截断​​它。如果不存在则创建它

那就是它总是一个新文件。没有以前的内容可用。如果你还想要以前的文件内容,那么使用

fopen("test.txt","a");

要从文件中读取,还可以使用

fopen("test.txt", "a+");

您还必须rewind()在使用文件时调用该文件a+,并且该文件已经存在。

第三个问题,您将当前图像替换为另一个图像,因此像递归一样工作。并且没有正确关闭文件,因此有些超时缓冲区未正确刷新。

这就像无限循环一样工作。所以它有什么用我不建议这个程序去做。

于 2012-07-28T01:18:14.450 回答