【问题标题】:fprintf in C doesn't print correctlyC 中的 fprintf 无法正确打印
【发布时间】: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()之前打开文件,然后再关闭它。

标签: c tree printf


【解决方案1】:

您在每次递归中都打开相同的文件(名称)以进行写入,并在关闭此文件之前进行递归。当您使用不同的写入文件的方法时,我无法理解输出缓冲会发生什么。至少,我建议你在第一次调用treePrint()之前打开文件,然后再关闭它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-22
    • 2021-07-08
    相关资源
    最近更新 更多