gpt4 book ai didi

C - 我试图在递归函数中使用 fprintf 但它只打印最少的行

转载 作者:太空宇宙 更新时间:2023-11-04 06:53:54 25 4
gpt4 key购买 nike

我在下面的递归 c 函数中使用 fprintf 打印到文件,尽管我看到的文件的唯一准确输出是:

  • 问题:它会飞吗?
  • 这是一个测试

我很困惑,因为当我使用 printf 时,标准输出的输出很好。它正在打印一棵树,应该更长。

我尝试了一些调试方法,但我想不出它会是什么了。

void treePrint(struct node *rootNodePointer)
{

FILE *fp;

fp = fopen("Output.txt", "w");// "w" means that we are going to write on this file

if (fp == NULL)
{
printf("Error opening file!\n");
exit(1);
}

if(rootNodePointer != NULL)
{
if(strcmp(rootNodePointer -> object, "question") == 0)
{
fprintf(fp, "question: %s\n", rootNodePointer -> value);
fprintf(fp, "this is a test");

printf("question: %s\n", rootNodePointer -> value);
treePrint(rootNodePointer -> left);
treePrint(rootNodePointer -> right);
}

else if(strcmp(rootNodePointer -> object, "object") == 0)
{
fprintf(fp, "object %s\n", rootNodePointer -> value);
printf("object: %s", rootNodePointer -> value);

}

}

else
{
printf("Error!");
exit(1);
}

printf("\n");
fclose(fp);
}//treePrint

*** Error in `Pangolins': double free or corruption (top): 0x000000000128b2e0 ***
======= Backtrace: =========
/lib64/libc.so.6(+0x7d023)[0x7eff65272023]
/lib64/libc.so.6(fclose+0x155)[0x7eff6525fff5]
Pangolins[0x400a9a]
Pangolins[0x400a1a]
Pangolins[0x400a03]
Pangolins[0x401131]
/lib64/libc.so.6(__libc_start_main+0xf5)[0x7eff65216b15]
Pangolins[0x4007c9]
======= Memory map: ========
00400000-00402000 r-xp 00000000 00:2c 2360081

最佳答案

您正在 fopen - 在递归函数(没有追加模式)中处理同一个文件 - 并且 fclose - 在该递归主体末尾附近处理同一个句柄。它将在每次调用时被覆盖。

您应该在该递归函数之外fopen 文件一次(例如在main 中),并将该FILE* 句柄传递给您的递归函数功能。不要忘记针对 fopen 的失败进行测试。所以你的递归函数应该声明为:

void treePrint(FILE*fp, struct node *NodePointer);

并且 treePrint 的主体不应包含对 fopenfclose 的任何调用。

而且你最好在你的递归函数中使用 fflush(至少在调试阶段),因为 stdio 是缓冲的。

不要忘记调用 fclose,可能在执行 fopen 的同一个外部函数(例如 main)中。

根据经验,打开的 FILE* 句柄包含一些 file descriptor(至少在 Unix 上),因此是相当昂贵的资源。在 1980 年代的 Unix 系统上,每个 process 只能有几十个文件描述符。在当前的 Linux 系统上,您可能被允许拥有一千个(但您可以使用 setrlimit(2) 来限制它们)。

最后,使用所有警告和调试信息编译您的代码(所以 gcc -Wall -Wextra -g 带有 GCC ),改进它以获得没有警告,并且 use 调试器 gdb.

您的错误 double free or corruptionmemory management 相关,因此请使用 valgrind 来查找该错误。您还可以使用 address sanitizerpassing also -fsanitize=addressgcc

关于C - 我试图在递归函数中使用 fprintf 但它只打印最少的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47518520/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com