我正在用c ++做一个程序,这个程序应该是一个词法分析器来制作编译器。因此我制作了标题“AnalisadorLexical.h”,其中我将所有函数和所有其他东西定义为文件的指针......,“AnalisadorLexical.cpp”,其中我定义了函数的逻辑和main.cpp。
在main.cpp中,我要求用户输入要分析的文件的名称以及写入结果的名称。这是在循环内完成的,而用户则输入许多文件进行分析。 当用户输入字体文件的名称和最终文件的名称时,我使用函数fopen两次打开第一个文件并写入第二个文件。在此之后,我调用构造函数来获取第一个文件的大小来创建一个向量,我将存储该文件的标记。 我的问题是当我使用fseek来获取文件的大小时。执行程序失败,我不知道该怎么做。
按照他们的代码。
main.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);
(...) `
感谢您的帮助。
答案 0 :(得分:0)
您需要检查fopen
的返回值。如果出现错误,您需要做一些有关它的事情。另外,为什么不是c1和c2 std::string
s?
答案 1 :(得分:0)
我不想找到文件的大小。但是,我也不会把它粘在手动分配的内存中。相反,我只是把它读成std::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>());
}