2017-03-28 14 views
0

私は、.cppファイルの中括弧をチェックするプログラムを書いています。プログラムは正常に動作し、構文エラーを見つけ、問題のある行の番号を表示して終了します。入力ファイルの行が最後の行であるかどうかを調べる方法は? C++

しかし、エラーが入力cppファイルの最後の行にある場合は、別のエラーメッセージを表示する必要があります。

私はそれを次のように実装しようとしましたが、間違っていると思います。とにかく動作しません:)

私は完全なコードを教えてくれませんでした。なぜなら、正しい変数を使った単純な条件でこれを解決できると思うからです。必要な場合は、後でコードを投稿することができます。

EDIT:コードの一部が要求通りに与えられます。 counterは、カウンタ++で1行ごとに更新されるint変数です。

for(int i = 0; i < line.length(); i++) 
     { 
      if (line[i] == '{') 
      { 
       stack.push(current); 
      } 
      else if(line[i] == '}') 
      { 
       if (!stack.isEmpty()) 
       { 
        stack.pop(opening); 
        cout << "Code block: " << opening << " - " << current << "\n"; 
       } 
       else 
       { 
        if(current == inputFile.eof()) 
        { 
         cout << "Syntax error at the end of the program."; 
        } 
        else 
        { 
         cout << "Syntax error in line: " << current << "\n"; 
         errorFound == true; 
        } 
       } 
      } 
+0

を好きではない場合、完全なコードを知っていいだろうイテレータのバージョンを使用することができます。そうすれば、あなたのコードに対する解決策を見つけることができます(もちろん、[mcve]を作る方がより良いでしょう!)。さて、あなたは 'current'をどのように読むのかを推測することしかできないので、良い解決策は得られません。 – Rakete1111

+3

ファイルの最後を**過去**に読み込もうとしない限り、 'eof'フラグは設定されません。これは、[documentation](http://en.cppreference.com/w/cpp/io/basic_ios/eof)で指摘されています。 –

+0

最後に '\ n'を打つまで最後まで読んだり読んだりすると、' ftell() 'コールがあなたにその位置を与えます。あなたがこのポジションを告げると、あなたは最後のラインにいます。 – Arash

答えて

1

これは私が考えることができる最良の解決策です。おそらくより良いものがあります。

std::ifstream input_file{ "file.txt }; 
std::vector<std::string> contents; 

// fill vector with file contents 
std::string cline; 
while (std::getline(input_file, cline)) 
    contents.push_back(cline); 

// now loop 
for (const auto& line : contents) { 
    //... 
    if (&line == &contents.back()) { 
     // do something at the end of file 
    } 
} 

あなたはポインタの比較:)

関連する問題