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

时间:2013-08-28 01:23:22

标签: c++ fopen fseek

我正在用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);

(...) `

感谢您的帮助。

2 个答案:

答案 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>());
}