1

私はc ++で1つのプログラムを実行しています。このプログラムは、コンパイラを作成するための語彙アナライザーである必要があります。したがって、すべての関数と他のすべてのものをファイルへのポインターとして定義するヘッダー「AnalisadorLexical.h」を作成しました...、関数の論理とmain.cppを定義する「AnalisadorLexical.cpp」。

main.cpp で、分析するファイルの名前と結果を書き込むファイルの名前を入力するようユーザーに求めます。これはループ内で行われ、そのためにユーザーは分析する多くのファイルを入力します。ユーザーがフォントファイルの名前と最終ファイルの名前を入力すると、関数 fopen を2回使用して最初のファイルを開き、2番目のファイルに書き込みます。この後、コンストラクターを呼び出して最初のファイルのサイズを取得し、ファイルのトークンを格納するベクターを作成します。私の問題は、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);

(...) `

助けてくれてありがとう。

4

2 に答える 2

0

の戻り値を確認する必要がありますfopen。エラーが発生した場合は、適切な処理を行う必要があります。また、なぜ c1 と c2 ではないstd::stringのですか?

于 2013-08-28T01:27:01.287 に答える
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>());
}
于 2013-08-28T01:29:54.977 に答える