2017-02-20 155 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/帮助/人,答案) –

相关问题