打开文件并使用fseek获取文件大小-C++

opening files and use of fseek to get size of file - C++

本文关键字:fseek 获取 文件大小 -C++ 文件      更新时间:2023-10-16

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

在main.cpp上,我要求用户输入要分析的文件的名称和写结果的名称。这是在一个循环中完成的,同时用户输入许多文件进行分析。当用户输入字体文件的名称和最终文件的名称时,我使用fopen功能两次打开第一个文件并在第二个文件上写入。在这之后,我调用构造函数来获取第一个文件的大小,以创建一个向量,在那里我将存储文件的令牌。我的问题a是当我使用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::Analisador Lexico(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);

(…)`

谢谢你们的帮助。

您需要检查fopen的返回值。如果有错误,你需要做一些理智的事情。还有,为什么c1和c2不是std::string

我不会费心去查找文件的大小。然而,我也不会将它粘贴到手动分配的内存中。相反,我会把它读成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>());
}