【问题标题】:fprintf not printing to a file,when file pointer declared elsewherefprintf 不打印到文件,当文件指针在别处声明时
【发布时间】:2018-06-19 19:03:18
【问题描述】:

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

驱动函数(main)在demo.y文件中。

我在demo.y 中声明了FILE *logout。但是当我在SymbolTable.cpp 的任何函数中执行fprintf(logout,"prinit sth"); 时,它不会打印任何内容。我在其余三个文件中添加了头文件,并在其他文件中添加了extern FILE *logout。

还有什么我必须包含的内容才能使fprintf 正常工作。

P.S 当我从demo.l 拨打fprintf 时,它打印得很好

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

demo.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;

}

【问题讨论】:

  • 如果您使用 C++ 编程,为什么不使用 C++ 文件流?
  • 打开 C++ 文件流同样简单,格式化输出与std::cout 相同(包括printf 系列所缺乏的类型安全)。还有一些其他的事情,比如你使用SymbolTable 对象的指针,这实际上是不需要的。
  • 至于你的问题,用你展示的代码,不可能帮助你,因为它应该可以正常工作。也许检查fopen 调用是否成功?
  • 至于如何帮助自己,请learn how to debug your programs。如果可能,请尝试find a simpler problem 至于最后一部分(更简单的问题),一种常见的方法是简化代码,可能通过重新开始并一次添加一小部分,在添加之前测试一切正常下一小块。当然,编译器会启用详细警告,看看它是否注意到了什么。
  • 您似乎正试图在打开日志文件之前打印到日志文件(在 SymbolTable 构造函数中)。

标签: c++ file printing


【解决方案1】:

让我们看看你的main 函数的一部分:

table = new SymbolTable();
// Other irrelevant code...
logout = fopen("log.txt","w");

当您执行new SymbolTable() 时,您将创建对象并构造它。这意味着您的 SymbolTable 构造函数将被调用。它发生在您打开文件之前。

这意味着您将调用fprintf,并为文件传递一个空指针,否则未初始化的全局变量将被“零”初始化(对于指针意味着它们将是空指针)。使用空指针会导致undefined behavior,我会说你不走运程序没有崩溃。

您需要更改顺序,或者在构造函数中不打印任何内容。

【讨论】:

  • 我做了logout = fopen("log.txt","w"); 然后table = new SymbolTable(); 仍然没有工作。你说的是这个订单吗?
  • @afsara_ben 是的,那个命令,如果这不起作用,那么还有其他错误,你没有告诉我们。你如何检查结果?也许您只需要在打印后fflush 文件?
  • 我正在附加文件等待。我认为这将是太多的代码,所以我包括了它的一部分
猜你喜欢
  • 1970-01-01
  • 2012-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-23
  • 2023-03-11
相关资源
最近更新 更多