c++ - fprintf 不打印到文件,当文件指针在别处声明时
问题描述
我有以下文件- SymbolTable.cpp
、、、SymbolTable.h
和demo.y
demo.l
log.txt
驱动程序函数(main)在demo.y
文件中。
我在中声明FILE *logout
。demo.y
但是当我fprintf(logout,"prinit sth");
在它的任何功能中执行时,SymbolTable.cpp
它不会打印任何东西。我在其余三个文件中添加了头文件,并且还包含extern FILE *logout
在其他文件中。
还有什么我必须包括的,以便fprintf
正常工作。
fprintf
PS当我打电话时它打印得很好demo.l
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");
}
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
演示.y
%{
#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;
}
解决方案
让我们看一下您的部分main
功能:
table = new SymbolTable();
// Other irrelevant code...
logout = fopen("log.txt","w");
当您new SymbolTable()
创建对象并构造它时。这意味着您的SymbolTable
构造函数将被调用。它发生在您打开文件之前。
这意味着您将调用为文件fprintf
传递一个空指针,否则未初始化的全局变量将被“零”初始化(对于指针意味着它们将是空指针)。使用空指针会导致未定义的行为,我会说你很不幸程序没有崩溃。
您需要更改顺序,或者不在构造函数中打印任何内容。
推荐阅读
- sparql - SPARQL:当一个主题有多个对象时如何获得最大值
- vba - 将 excel 用户表单数据传输到组合框中选择的工作表
- mysql - SQL - 用户斑马表 - 两个用户是否互相关注?
- c# - 如果它是空的,如何停止 WPF 中的 Rect 绘图?
- javascript - 如何使用jsPDF在下载前预览pdf文件
- python - 将两个数据帧乘以矩阵,保留列和索引标题
- xcode - Xcode Playground 卡在运行状态
- java - 使用 CountDownTimer 更新 ProgressBar
- excel - 在 VBA 中显示过滤结果
- node.js - GraphQL - 如果父返回类型是对象列表,则模式拼接上的模式委派不起作用