1

我正在用 c++ 做一个程序,这个程序应该是一个词法分析器来制作一个编译器。因此,我创建了标题“AnalisadorLexical.h”,在其中我将所有函数和所有其他内容定义为指向文件的指针......,在“AnalisadorLexical.cpp”中定义了函数和 main.cpp 的逻辑。

在 main.cpp 中,我要求用户输入要分析的文件的名称和写入结果的名称。这是在一个循环中完成的,同时用户输入许多文件进行分析。当用户输入字体文件的名称和最终文件的名称时,我使用函数 fopen 两次打开第一个文件并写入第二个文件。在此之后,我调用构造函数来获取第一个文件的大小以创建一个向量,我将在其中存储文件的标记。我的问题是当我使用 fseek 来获取文件的大小时。程序执行失败,我不知道该怎么办。

遵循他们的代码。

主.cpp:

`int main(){

char *c1, *c2; 
c1 = new char[30]; 
c2 = new char[30]; 

FILE *f1; 
FILE *f2; 

cout<<"Arquivo de entrada:"<<endl; 

while(cin>>c1){

    cin>>c2; 

    f1 = fopen(c1, "r"); 
    f2 = fopen(c2, "w"); 

    AnalisadorLexico al(f1, f2);
    al.analiseLexica(); 
    fclose(f1); 
    fclose(f2); 
} 

返回0;}`

AnalisadorLexico.cpp - 构造函数:

`AnalisadorLexico::AnalisadorLexico(FILE* f1, FILE* f2){

//Aloca os arquivos 
fp = f1;//arquivo sendo lido (de entrada)
fs = f2;//arquivo de saída

//tamanho do arquivo 
fseek(fp, 0L, SEEK_END);

tk_Size = ftell(fp);

//vetor de tokens 
tk_vet = new token[tk_Size];

//inicializa com 0
tk_count = 0;

monta_tabelaPR();
montaSb_vet();

}(...) `

AnalisadorLexico.h - 构造函数的定义

` (...)

上市:

//Construtor de classe 

AnalisadorLexico(FILE *f1, FILE *f2);

(...) `

谢谢你们的帮助。

4

2 回答 2

0

我不会费心试图找到文件的大小。但是,我也不会将其粘贴到手动分配的内存中。相反,我只需将其读入 astd::vector<char>并继续我实际必须做的工作:

std::vector<char> v;
{
    std::ifstream in(c1);
    if (!in) {
        throw std::runtime_error("failed to open '" + std::string(c1) "' for reading");
    }
    v.insert(std::istreambuf_iterator<char>(in), std::istreambuf_iterator<char>());
}
于 2013-08-28T01:29:54.977 回答
0

您需要检查fopen. 如果有错误,你需要做一些理智的事情。另外,为什么不是 c1 和 c2 std::strings?

于 2013-08-28T01:27:01.287 回答