【问题标题】:Why is FILE not recognized even after putting #include <stdio.h>? (c language)为什么即使放置#include <stdio.h> 文件也无法识别? (c 语言)
【发布时间】:2013-06-22 13:59:25
【问题描述】:

我在一个程序上添加了这段代码,据说是为了创建一个文本文件(当我添加标记为 //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(因为文件在stdio.h中定义)然后以Unicode格式保存(因为程序告诉我以Unicode格式保存它,否则会出现更多错误),通过转到FILE->提前保存选项->带有签名的UTF 8。关于“以Unicode格式保存文件的错误仍然存​​在,直到我删除了一些包含德语字符的cmets /* */。

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

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

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

【问题讨论】:

  • 如果您询问有关错误消息的问题,为什么不包括实际错误消息?即使是一些语法正确的代码也会是一个不错的选择。
  • #in l 包括? prile 未定义? fprintf(pfile, "%d", number-&gt;var_inp? SSCCE,请。
  • 我的电脑运行缓慢,这是我从我的代码中记得的 :) 抱歉。这是代码
  • 之前 FILE.
  • 我认为如果你不能处理基本的C语法错误,用C写视频处理代码可能不是一个好计划。

标签: c unicode text-files


【解决方案1】:

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

{
  /*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 &lt;stdio.h&gt;?????????

如果您要使用FILEstdio.h 定义,它必须在其他任何地方声明。简而言之,不要将任何类型声明为FILE,使用stdio.h 定义。

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

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

编辑

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

C89/C90 需要一个块(由{} 包围的代码块 由零个或多个声明后跟零个或多个声明组成 陈述。声明不必在开头 函数,就在一个块的开头。 C99放宽了这个规定 (借用 C++),允许声明和语句 混合在一个块内。看起来您的编译器正在执行 C89/C90 规则。微软的 C 编译器因此而臭名昭著。

这是更简洁的准确的解释。

【讨论】:

  • 我看不出有什么不同 - 对不起,请告诉我好吗? :P
  • @Shumail92,通过将代码“封装”在“大括号”中来创建新范围
  • 我明白了。但你确定这是问题吗?无论如何,让我们看看他是否发布了错误消息和其他代码。
  • @mc8,你试过这个吗?如果它没有价值,我会删除它,但我认为它可能会有所帮助。
  • C89/C90 需要一个块(由{} 包围的代码块,包含零个或多个声明,后跟零个或多个语句。声明不必在函数的开头,只需在块的开头。C99 放宽了这个规则(从 C++ 借用),允许在块中混合声明和语句。它看起来您的编译器正在执行 C89/C90 规则。Microsoft 的 C 编译器因此而臭名昭著。
猜你喜欢
  • 2018-12-09
  • 1970-01-01
  • 2021-08-08
  • 2020-12-14
  • 1970-01-01
  • 1970-01-01
  • 2017-01-09
  • 2013-06-10
相关资源
最近更新 更多