【发布时间】:2014-12-08 19:00:16
【问题描述】:
我在尝试打印一些树节点时遇到了很多麻烦。 printf 函数在终端上正确打印所有内容,但 fputs 和 fprintf 的 2 个版本只打印:
问题:胖 问:胖 对象:皮特 对象:皮特 问:圆 问:圆 对象:披萨 对象:披萨 对象:穿山甲 对象:穿山甲
$ cat test.txt 问:胖 问:胖 和 哥林
代码如下:
void treePrint(struct node *ptr)
{
if (ptr == NULL)
printf("ERROR!!!");
else
{
char line[1000];
char filename[] = "test.txt";
FILE *file = fopen(filename, "w");
if (!file)
{
fprintf(stderr, "can't open %s for writing\n", filename);
exit(-1);
}
if (ptr -> yes_ptr != NULL && ptr -> no_ptr != NULL)
{
strcpy(line, "question: ");
strcat(line, ptr -> questionName);
strcat(line, "\n");
printf("%s", line);
fprintf(file, "%s", line);
fputs (line, file);
fprintf(file, "question: %s\n", ptr -> questionName);
treePrint(ptr -> yes_ptr);
treePrint(ptr -> no_ptr);
}
else
{
strcpy(line, "object: ");
strcat(line, ptr -> objectName);
strcat(line, "\n");
printf("%s", line);
fprintf(file, "%s", line);
fputs (line, file);
fprintf(file, "object: %s\n", ptr -> objectName);
}
fclose(file);
}
}
【问题讨论】:
-
不应该发生。也许试试
fprintfs 和stdout进行输出,这样它们就会像printf一样输出到控制台,所以你会看到。 -
将
fprintf(stderr, "can't open %s for writing\n", filename)替换为perror(filename)。尝试一下。你会喜欢的。 -
我确实尝试过使用 stdout,它工作得很好,就像 printf 一样。所以问题出在文件上?
-
不要在
->或.运算符周围放置空格;它们结合得非常紧密,并且空格是非传统的(并使您的代码更难阅读)。确保您的printf()操作以换行符结尾。许多人这样做,但printf("ERROR!!!");没有(但应该)。fprintf(file, "%s", line);和fputs (line, file);这对行出现两次,每次都将相同的信息写入文件两次;最好保持一致并连续两次使用相同的调用,或者消除重复。请注意,这两个操作都不会在末尾添加换行符。 -
您正在打开相同的文件(名称)以在每次递归中写入,并在关闭此文件之前进行递归。当您使用不同的写入文件的方法时,我无法理解输出缓冲会发生什么。至少,我建议你在第一次调用
treePrint()之前打开文件,然后再关闭它。