Hello_world_xm 2024-01-28 23:21 采纳率: 100%
浏览 225
已结题

报错“Debug Assertion Failed”,求解决方法

在写计算机二级C语言题目时报错“Debug Assertion Failed” 编译环境是vs2010
应该是NONO子函数中fscanf函数的问题
这是我的代码:
#include <stdio.h>
#include <math.h>
double  fun ( double  eps) /*只有fun函数是我写的,剩下的代码都是题目给的*/
{
    double s=1.0,s1=1.0;
    int n=1;
    while(s1>=eps)
    {
        s1=s1*n/(2*n+1);
        s=s+s1;
        n++;
    }
    return 2*s;
}

main( )
{ double  x;void NONO ();
  printf("Input eps:") ;
  scanf("%lf",&x); printf("\neps = %lf, PI=%lf\n", x, fun(x));
  NONO();
}

void NONO ()
{/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */
  FILE *fp, *wf ;
  int i ;
  double x ;

  fp = fopen("in.dat","r") ;
  wf = fopen("out.dat","w") ;
  for(i = 0 ; i < 10 ; i++) {
    fscanf(fp, "%lf", &x) ;
    fprintf(wf, "%lf\n", fun(x)) ;
  }
  fclose(fp) ;
  fclose(wf) ;
}
/*
附题目 :
编写函数fun,其功能是:根据以下公式求π的值(要求精度0.0005,即某项小于0.0005时停止迭代).
请编写函数fun,其功能是根据以下公式求π的值(要求满足精度0.0005,即某项小于0.0005时停止迭代).
π/2=1+1/3+(1*2)/(3*5)+(1*2*3)/(3*5*7)+……+(1*2*3*4*……*n)/(3*5*7*……*(2n+1))
程序运行后,若输入精度为0.0005,则输出为3.141106

*/

img

以上是运行结果及报错内容,in.dat文件内容如下
以下是in.dat文件内容
0.0005
0.00005
0.000005
0.0001
0.00001
0.000001
0.0004
0.00004
0.000004
0.0003

img

我的解答思路和尝试过的方法:如下图所示,in.dat文件和源文件prog1.c(内容即上文中代码)在同一文件夹中,在该项目文件夹下也发现了out.dat文件(内容空白),因此判断是因为某些原因fscanf函数读取不到内容而报错,并排除in.dat文件无法打开的情况。(能力有限,只能推断出这么多了)

img

报错产生的原因和解决方案是什么QAQ,望各位专家不吝赐教!
  • 写回答

7条回答 默认 最新

  • GISer Liu 2024-01-28 23:33
    关注

    该回答引用自GPT-4,由博主GIS_Liu编写:

    您遇到的 "Debug Assertion Failed" 错误通常意味着程序在运行时检查到了一个不应该发生的条件。具体到这个情况,错误提示为 (stream != NULL),这表明 fscanf 函数在尝试读取文件时发现文件指针 fpNULL。这通常是因为文件没有成功打开。

    让我们逐一分析您提供的信息和代码来解决这个问题:

    1. 首先,您需要确保 in.dat 文件确实存在于程序尝试打开它的目录下。在这种情况下,您已经确认过这一点,因为 in.dat 文件和 prog1.c 在同一个文件夹下。

    2. 其次,即使文件存在,还可能有其他原因导致文件无法打开。这可能包括但不限于:

      • 文件权限问题:确保您的程序有权限读取该文件。
      • 文件正在被其他程序使用。
      • 文件路径不正确:如果程序是从另一个目录运行的,相对路径可能会不同。
    3. 程序中 fopen 函数的调用看起来是正确的,但是您应该始终检查 fopen 的返回值以确保文件真的打开了。在调用 fscanf 之前,您应该添加一些错误检查的代码。

    基于以上分析,下面是对您的程序的修改建议,增加了对文件打开操作的错误检查:

    void NONO () {
        FILE *fp, *wf;
        int i;
        double x;
    
        fp = fopen("in.dat","r");
        if (fp == NULL) {
            perror("Error opening file in.dat");
            return; // 退出函数
        }
    
        wf = fopen("out.dat","w");
        if (wf == NULL) {
            perror("Error opening file out.dat");
            fclose(fp); // 关闭已经打开的文件
            return; // 退出函数
        }
    
        for(i = 0; i < 10; i++) {
            if (fscanf(fp, "%lf", &x) != 1) {
                fprintf(stderr, "Error reading from in.dat\n");
                break; // 退出循环
            }
            fprintf(wf, "%lf\n", fun(x));
        }
    
        fclose(fp);
        fclose(wf);
    }
    

    在这个修改版本中,我增加了对 fopen 返回值的检查。如果 fopen 返回 NULL,则会打印错误消息并退出函数。对于 fscanf,我增加了检查其返回值,确保它正确读取了一个值。

    请尝试这些修改,并再次运行程序,看看是否解决了问题。如果问题仍然存在,那可能需要进一步检查文件的路径和权限设置。

    如果该回答解决了您的问题,请采纳!如果没有,请详述问题所在!

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(6条)

报告相同问题?

问题事件

  • 系统已结题 2月6日
  • 已采纳回答 1月29日
  • 修改了问题 1月28日
  • 赞助了问题酬金15元 1月28日
  • 展开全部