2012-09-17 14 views
5

特定の文字列の行番号を返すことができる特定の関数がC++にありますか?検索された文字列が続く行番号を返しますC++特定の文字列のテキストファイルを検索し、その文字列がある行番号を返す

cout << "found: " << search << endl; 

ifstream fileInput; 
int offset; 
string line; 
char* search = "a"; // test variable to search in file 
// open file to search 
fileInput.open(cfilename.c_str()); 
if(fileInput.is_open()) { 
    while(!fileInput.eof()) { 
     getline(fileInput, line); 
     if ((offset = line.find(search, 0)) != string::npos) { 
      cout << "found: " << search << endl; 
     } 
    } 
    fileInput.close(); 
} 
else cout << "Unable to open file."; 

は、私はいくつかのコードを追加します。

答えて

10

現在の行番号を記録するためにカウンタ変数を使用するだけです。 getlineと呼ぶたびに...行を読む...そのあと変数を増やしてください。

unsigned int curLine = 0; 
while(getline(fileInput, line)) { // I changed this, see below 
    curLine++; 
    if (line.find(search, 0) != string::npos) { 
     cout << "found: " << search << "line: " << curLine << endl; 
    } 
} 

また...

while(!fileInput.eof())

読んeofが設定されませんので、あなたは無限ループを持っているときにエラーが発生した場合

while(getline(fileInput, line))

でなければなりません。 std::getlineは、暗黙的にboolに変換できるストリーム(ストリームを渡したストリーム)を返します。このストリームは、ファイルの最後にいる場合だけでなく、読み続けることができるかどうかを示します。

eofは、例えば、badが設定されている、場合は、それを読んでいる間に、誰かがファイルを削除し、あなたはまだループを終了しますが、終了も意志設定されている場合など

+0

ああ私はその単純なカウンタ方法を考えなかったと信じています。私はコールする特別な機能があると思っていました。ありがとう、私はそれを解決しました。 –

+0

@JohnMarston:問題はありませんが、ループ状態を変更してください。それはあなたがエラー状態を処理することはできません。 –

4

の修正版受け入れられた答え。 [提案が望ましいされているだろうが、私はまだコメントできないような答えにコメント。] 次のコードは、テストされていないが、それはforループ

for(unsigned int curLine = 0; getline(fileInput, line); curLine++) { 
    if (line.find(search) != string::npos) { 
     cout << "found: " << search << "line: " << curLine << endl; 
    } 
} 

を動作するはずですが、それはわずかに小さくなります(おそらく困難に読む)。 findの0は、デフォルトでは文字列全体を検索するので、不要になります。

関連する問題