-3

这个错误发生在我的程序中:

Debug Assertion Failed!

Program:C:\JM\.\bin\ldecod.exe
File: f:\ff\vctools\crt_bld\self_x86\crt\src\fscanf.c
Line:52

Expression: (stream!=NULL)

For information on how your program can cause an assertion
failure, see the Visual C++ documentation on asserts.

(Press Retry to debug the application.)

这里似乎有什么问题?

代码

这是我使用 fscanf 的代码部分。当 mi=297 时,它工作得非常好。

int myframe[29699];
........

if (CONCEAL==1)
{
  FILE*concealfile;
  concealfile=fopen("myerrsim%15carphone.txt","r");
  for(mi=0; mi<14850; mi++)
  {
      fscanf(concealfile,"%d\n", &myframe[mi]);
  }
  if (myctr==currMB->mbAddrX+(((currMB)->p_Slice)->p_Img)->number*99 && currMB->mbAddrX+(((currMB)->p_Slice)->p_Img)->number>0)
  {
      if (myframe[myctr]==1)
      {
          mbmode=0;
      }
      myctr++;
  }
}

附加问题!我遇到了几个类似的错误。这些程序在源代码的不同部分中断,其中一些内置于“fscanf”等函数中。我不知道原因。有时我电脑上的一个程序,比如“Flash Player”会通知我某种错误。这是因为我的程序中使用的指针试图访问“Flash Player”吗?为什么会发生这种情况以及可能的解决方法是什么?

简单地说,断言错误是什么?

对于@Jonathan Leffler

#ifdef _DEBUG
        /*
         * Report error.
         *
         * If _CRT_ERROR has _CRTDBG_REPORT_WNDW on, and user chooses
         * "Retry", call the debugger.
         *
         * Otherwise, continue execution.
         *
         */

        if (rterrnum != _RT_CRNL && rterrnum != _RT_BANNER && rterrnum != _RT_CRT_NOTINIT)
        {
            switch (_CrtDbgReportW(_CRT_ERROR, NULL, 0, NULL, L"%s", error_text))
            {
  ->        case 1: _CrtDbgBreak(); msgshown = 1; break;
            case 0: msgshown = 1; break;
            }
        }

其中 -> 是意外断点。位于 C:\Program Files\Microsoft Visual Studio 11.0\VC\crt\src\crt0msg.c

4

1 回答 1

2

看来你做了类似的事情:

char name[64];
FILE *fp = fopen("c:/non-existent/file", "r");
fscanf(fp, "%s", name);

没有检查fopen()是否成功,并fprintf()触发了断言失败。当fopen()失败时,它返回一个 NULL 指针,并且断言说stream != NULL(其中 'stream' 是文件流,fscanf(), and means aFILE * such asfp` 的第一个参数)。

fscanf_s()因为您在 Windows 上,所以您使用了一个外部机会- 这是相同的基本故事,但会fscanf_s()检查fscanf()没有的此类问题。

可能的修复:

char name[64];
FILE *fp = fopen("c:/non-existent/file", "r");
if (fp == 0)
    ...report failure to open file (and exit or return)...
if (fscanf(fp, "%s", name) != 1)
    ...report read failure...
于 2013-08-31T03:09:54.910 回答