C++ 当文件指针在别处声明时,fprintf未打印到文件

C++ 当文件指针在别处声明时,fprintf未打印到文件,c++,file,printing,C++,File,Printing,我有以下文件-SymbolTable.cpp,SymbolTable.h,demo.y,demo.l和log.txt 驱动程序功能(main)位于demo.y文件中 我在demo.y中声明了FILE*logout在SymbolTable.cpp的任何功能中,它都不会打印任何内容。我在剩下的三个文件中添加了头文件,并在其他文件中包含了extern file*logout 还有什么我必须包括的,以便fprintf正常工作的吗 另外,当我从demo.l %option noyywrap %{ #inc

我有以下文件-
SymbolTable.cpp
SymbolTable.h
demo.y
demo.l
log.txt

驱动程序功能(main)位于
demo.y
文件中

我在
demo.y
中声明了
FILE*logout
SymbolTable.cpp的任何功能中,它都不会打印任何内容。我在剩下的三个文件中添加了头文件,并在其他文件中包含了
extern file*logout

还有什么我必须包括的,以便
fprintf
正常工作的吗

另外,当我从
demo.l

%option noyywrap
%{
#include<stdlib.h>
#include<stdio.h>
#include<string.h>

#include "SymbolTable.h"
#include "SymbolInfo.h"
#include "ScopeTable.h"
#include "y.tab.h"

void yyerror (char *);
extern YYSTYPE tag ;    
extern SymbolTable *table;
extern int tableSize;

extern FILE *logout;
extern FILE *temp;

%}

id [a-z]*
newline \n
ADDOP "+"
digit[0-9]

%%
......remaining code
SymbolTable.cpp

#include "SymbolTable.h"
#include "SymbolInfo.h"
#include "ScopeTable.h"
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<map>
#include<string>
#include<vector>
using namespace std;

int tableSize = 7;
extern FILE *logout;

SymbolTable::SymbolTable()
{
    cout<<"in SymbolTable constructor"<<endl;
    fprintf(logout,"in SymbolTable constructor\n");

}
演示

%{
#include<stdio.h>
#include<stdlib.h>  
#include<string.h>
#include "SymbolTable.h"
#include "SymbolInfo.h"
#include "ScopeTable.h"
//#define yydebug 1

int yyparse(void);
int yylex(void);
extern char * yytext;
extern FILE * yyin;
extern int tableSize;
//extern FILE *temp;

SymbolTable *table;

FILE *logout;
void yyerror (const char *s)
{
    fprintf(stderr,"%s\n",s);
    return;
}

%}
%%

%%
int main(int argc, char *argv[])
{

    table = new SymbolTable();
    FILE *fp;
    if((fp = fopen(argv[1],"r")) == NULL)
    {
        printf("cannot open file");
        exit(1);
    }
    logout = fopen("log.txt","w");
    //temp = fopen("temp.txt","w");
    yyin = fp;
    yyparse();
    return 0;

}
%{
#包括
#包括
#包括
#包括“SymbolTable.h”
#包括“SymbolInfo.h”
#包括“ScopeTable.h”
//#定义调试1
int(void);
int yylex(无效);
外部字符*文本;
外部文件*yyin;
extern-int表大小;
//外部文件*temp;
SymbolTable*表格;
文件*注销;
无效错误(常量字符*s)
{
fprintf(标准字符,“%s\n”,s);
返回;
}
%}
%%
%%
int main(int argc,char*argv[])
{
表=新的SymbolTable();
文件*fp;
if((fp=fopen(argv[1],“r”)==NULL)
{
printf(“无法打开文件”);
出口(1);
}
注销=fopen(“log.txt”,“w”);
//temp=fopen(“temp.txt”,“w”);
yyin=fp;
yyparse();
返回0;
}

让我们看看您的
主功能的一部分:

table = new SymbolTable();
// Other irrelevant code...
logout = fopen("log.txt","w");
执行
newsymboltable()
操作时,将创建并构造对象。这意味着您的
SymbolTable
构造函数将被调用。它发生在你打开文件之前

这意味着您将调用
fprintf
传递文件的空指针,否则未初始化的全局变量将被初始化为“零”(这对于指针意味着它们将是空指针)。使用空指针会导致出现错误,我要说的是,你很不幸程序没有崩溃


您需要更改顺序,或者不在构造函数中打印任何东西。< /P>如果您在C++中编程,为什么不使用C++文件流?打开C++文件流也一样容易,格式化输出与(包括<代码> Prtff< /Cuth-Cuffe缺乏的类型安全性)相同。还有一些其他的事情,比如你用一个指针指向
SymbolTable
对象,这实际上是不需要的。至于你的问题,你展示的代码不可能帮助你,因为它应该工作得很好。请检查
fopen
呼叫是否成功?至于您可以如何帮助自己,请。如果可能的话,试着对最后一部分(更简单的问题)进行测试,一种常见的方法是简化代码,可能是重新开始,一次添加一个小部分,在添加下一个小部分之前测试一切是否正常。当然,还可以启用编译器的详细警告,以查看它是否注意到了什么。在打开日志文件之前,您似乎正在尝试打印日志文件(在
SymbolTable
构造函数中)然后
表格=新的SymbolTable()仍不工作。你说的是这个订单吗?@afsara_ben是的,那个订单是的,如果这个订单不起作用,那么还有其他一些错误,你没有告诉我们。你如何检查结果?也许你所需要的只是打印后对文件进行
fflush
im附加文件等待。我认为这将是太多的代码,所以我包括了它的一部分