2017-02-20 17 views
0

プログラムに特定の文字列がある行番号を返すようにしたい。 行全体がこの文字列である必要があります。ファイル内に特定の文字列を含む行番号を見つける

私はなぜそれが常にファイル全体の長さを返すのかわかりません。

マイコード:

#include <iostream> 
#include <string> 
#include <fstream> 
#include <limits> 
#include <windows.h> 

using namespace std; 


int main() { 
int x; 
x=0; 
string filename, inputfilename, line; 
ifstream inputfile; 

while(!inputfile.is_open()) { 
    cout << "Input filename: "; 
    getline (cin, inputfilename); 
    inputfile.open(inputfilename.c_str(),ios::in | ios::binary); 
} 

//string obj = "[I.LOVE.COOKIES]"; //Was like this 
string obj = "[I.LOVE.COOKIES]\r"; //Adding \r solved the problem 
while(getline(inputfile, line)) 
{ 
    if(line==obj) 
    { 
     return x; 
    } 
    else 
    { 
     x++; 
    } 

} 
return 0; 
} 
+1

ファイルには検索文字列が含まれていないため、表示されているコードは、値を指定せずに 'main()'から返すことで、未定義の動作を示します。さらに、このプログラムは、プログラムからの戻りコードが7ビットのみに制限されているため、非常に小さいファイルを適切に処理します。言い換えれば、このすべてのものをスクラップし、最初からそれを書き直す。 –

+1

テキストを読んでいるなら、私はios :: binaryを削除したいと思っています。 – Baldrick

+0

@SamVarshavchikなぜ値UBなしでメインから戻るのですか? – user463035818

答えて

0

あなたは、ファイルを開くときに引数としてios::binaryを省略する必要があるかもしれません。

問題は、ウィンドウでは、行が2文字の末尾が\r\nであることです。ファイルをバイナリモードで開くと、std::getlineは行を読み、キャリッジリターン\rを含みます。文字列"[I.LOVE.COOKIES]"\rで終わらないため、文字列の比較に失敗します。

+0

ありがとうございます \ r文字列の最後に問題が解決しました 文字列obj = "[I.LOVE.COOKIES] \ r"; – Ziemni

+0

@Ziemni [誰かが私の質問に答えるとどうすればいいですか?](http://stackoverflow.com/ヘルプ/誰かの回答) –

関連する問題