2017-02-20 108 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作爲參數。

問題是在windows上,一行以兩個字符\r\n結尾。如果以二進制模式打開文件,std::getline將讀取一行幷包含回車符\r。這意味着您的字符串比較失敗,因爲字符串"[I.LOVE.COOKIES]"不以\r結束。

+0

非常感謝! Adding \ r在字符串的末尾解決了問題。 string obj =「[I.LOVE.COOKIES] \ r」; – Ziemni

+0

@Ziemni [當某人回答我的問題時該怎麼辦?](http://stackoverflow.com/幫助/人,答案) –

相關問題