2017-02-20 40 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 :: двоичный, если вы читаете текст ... – Baldrick

+0

@SamVarshavchik почему возвращается из main без значения UB? – user463035818

ответ

0

Вам может понадобиться опустить ios::binary в качестве аргумента при открытии файла.

Проблема в том, что на окнах линия заканчивается двумя символами \r\n. Если вы откроете файл в двоичном режиме, std::getline прочитает строку и включит возврат каретки \r. Это означает, что сравнение строк не выполняется, потому что строка "[I.LOVE.COOKIES]" не заканчивается \r.

+0

Большое спасибо! Добавление \ r в конце строки решена проблема. string obj = "[I.LOVE.COOKIES] \ r"; – Ziemni

+0

@Ziemni [Что делать, если кто-то отвечает на мой вопрос?] (http://stackoverflow.com/ помощь/кто-ответы) –