2012-07-28 51 views
0

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

这里是我的测试类:

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

谢谢

回答

3

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

编辑:其实,在你的代码中,要做的恰当的事情就是在execl之前简单地将文件关闭;这当然会冲洗它。另外,您不需要“w +”,“输入”对于您正在写入的文件而言不是一个很好的名称。

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

尼特:不要忘记用\ n结束您的printfs第一个缺乏。在错误信息中特别谨慎,这些信息没有经过彻底的测试。

+0

谢谢!为什么'fopen(argv [1],“r”)'现在在我的程序中失败了? – darksky 2012-07-28 00:55:55

+0

我不能说,因为该行不在您发布的代码中。 – 2012-07-28 01:05:36

+0

为什么我需要在使用'a +'打开的文件上使用'rewind'? – darksky 2012-07-28 11:00:57

1

你要什么没有明确specified.But我想你用./a.out这是本program.Then

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

第二个问题是使用

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

//打开文件,如果存在,截断它。如果不存在,那么创建它

也就是说它始终是一个新鲜的file.no以前的内容可用的。如果你想以前的文件内容也然后使用

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

从文件中读取,也可以使用

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

您还将有当a+被使用,并且该文件已经存在调用rewind()上的文件。

第三个问题你用另一个图像替换当前图像,所以像recursion.and一样工作,没有适当的文件关闭维护,所以有时超出缓冲区没有适当刷新。

这就像无限循环这样的工作。那么它有什么用处呢我不建议这个程序去做。

+0

谢谢!我编辑了你的答案 - 我添加了一些我刚发现的东西。两个答案都是对的。我会标记哪一个是正确的? – darksky 2012-07-28 10:58:30

+0

@Darksky你以前接受了我的回答,这回答了你的问题,你说这是有效的。你的问题中没有什么关于打开追加等等。如果您还有其他问题,则应该发布它们,而不是在评论中进行扩展讨论。 – 2012-07-28 18:54:45