0

我在一个程序上添加了这段代码,据说是为了创建一个文本文件(当我添加标有 //textfile 的程序底部时出现错误)

//here is a fragment of the program

    void next_macroblock(Macroblock *currMB)
    {
      VideoParameters *p_Vid = currMB->p_Vid;
      InputParameters *p_Inp = currMB->p_Inp;
      Slice *currSlice = currMB->p_Slice;
      int slice_type = currSlice->slice_type;
      BitCounter *mbBits = &currMB->bits;

          (some codes deleted)

  // Statistics
  cur_stats->quant[slice_type] += currMB->qp;
  ++cur_stats->num_macroblocks[slice_type];

  //textfile
  FILE * pFile;
  pFile = fopen ("mytable.txt","w");
  fprintf (pFile, " \t %d \t | \n",mbBits->mb_total);
  fclose (pFile);
}

错误:

**c:\jm 18.4\lencod\src\macroblock.c(223): error C2275: 'FILE' : illegal use of this type as an expression**
          **c:\program files\microsoft visual studio 11.0\vc\include\stdio.h(66) : see declaration of 'FILE'**
c:\jm 18.4\lencod\src\macroblock.c(223): error C2065: 'pFile' : undeclared identifier
c:\jm 18.4\lencod\src\macroblock.c(224): error C2065: 'pFile' : undeclared identifier
c:\jm 18.4\lencod\src\macroblock.c(224): warning C4047: '=' : 'int' differs in levels of indirection from 'FILE *'
c:\jm 18.4\lencod\src\macroblock.c(225): error C2065: 'pFile' : undeclared identifier
c:\jm 18.4\lencod\src\macroblock.c(225): warning C4047: 'function' : 'FILE *' differs in levels of indirection from 'int'
c:\jm 18.4\lencod\src\macroblock.c(225): warning C4024: 'fprintf' : different types for formal and actual parameter 1
c:\jm 18.4\lencod\src\macroblock.c(226): error C2065: 'pFile' : undeclared identifier
c:\jm 18.4\lencod\src\macroblock.c(226): warning C4047: 'function' : 'FILE *' differs in levels of indirection from 'int'
c:\jm 18.4\lencod\src\macroblock.c(226): warning C4024: 'fclose' : different types for formal and actual parameter 1

问题来了:我已经放置了#include(因为 FILE 在 stdio.h 中定义)然后以 Unicode 格式保存(因为程序告诉我以 unicode 格式保存,否则会出现更多错误),通过转到 FILE- >高级保存选项->带签名的UTF 8。关于“以 Unicode 格式保存文件的错误仍然存​​在,直到我删除了一些包含德语字符的评论 /* */。

关于 FILE 的错误仍然相同。什么地方出了错?

根据@macduff 和@KeithThompson 的说法,我应该在我所做的那部分代码中包含 { } 。错误消失了,但没有创建文本文件(我想做的是创建一个文本文件,用于打印代码中变量的值。)

新问题:如果 Visual Studio 2012 遵循 C89/C90 标准并且我不能在函数或块的中间声明变量,那么创建文本文件以打印变量 mbBit 的变化值的最佳方法是什么->mb_total? (我应该将 { } 放在代码上以创建文本文件、创建新函数还是在头文件中声明我的参数 - 如果是,我必须声明哪些参数以及如何声明它们?)

4

1 回答 1

2

我不相信编译器会允许你在函数中声明一个变量,当然这取决于编译器/设置/等。也许尝试开始和结束{}

{
  /*the other variables are declared and defined before this code fragment*/
  FILE *pfile;
  pfile=fopen("textfile.txt","w");
  fprintf(pfile, "%d", number->var_inp);
  fclose(pfile);
}

解决您可能遇到的任何范围界定问题。

为了解决您的一些问题:

`The program '[5780] lencod.exe' has exited with code 300 (0x12c).`

这看起来不错,只要能够无错误地编译代码。可能正在写入文件,但您必须打开它并查看以确保。文本文件将位于程序正在执行的工作目录中。放置一个绝对路径,可能会方便一点,比如

 pfile=fopen("C:\\textfile.txt","a");

您现在可能只想追加用于调试目的。此外,您可能希望包含一条测试消息,例如:

 fprintf(pfile, "Get the number\n");
 fprintf(pfile, "%d", number->var_inp);

我有一个问题:如果您要使用 FILE 作为数据类型,除了放置 #include <stdio.h>?????????之外,您是否必须在程序中的其他任何地方声明它?

如果要使用 的stdio.h定义FILE,则不得在其他任何地方声明。简而言之,不要将任何类型声明为FILE,使用stdio.h定义。

范围界定问题是什么意思?

看来您的编译器希望首先声明中的所有变量,然后声明功能代码。如果你想创建另一个临时使用的变量,比如只是为了获得一个文件的句柄,你必须在另一个范围内进行。定义范围的一种非常简单的方法是{}在任何代码周围添加 。创建新范围后,您可以定义新变量,然后对其进行处理。但是,}. 在我们的例子中,这无关紧要。

编辑

通过引用 KeithThompson 的评论,我使这个解释更加准确。我觉得这些评论真的值得在这里,他写道:

C89/C90 需要一个块(由零个或多个声明包围并由零个或多个声明组成的代码块,{然后}是零个或多个语句。声明不必位于函数的开头,只需位于块的开头即可。 C99 放宽了这个规则(从 C++ 借用),允许在一个块中混合声明和语句。看起来你的编译器正在执行 C89/C90 规则。微软的 C 编译器因此而臭名昭著。

这是更简洁准确的解释。

于 2013-06-25T16:53:46.417 回答