Как найти строку из 2 слов в файле?

0

С помощью следующего кода я могу найти строку из 1 слова (в этом примере я ищу "Word"):

ifstream file("file.txt");
string str;
while (file >> str){
    if (str.find("Word") != string::npos){
         ////
    }
}

Но это не работает, если я хочу найти, например, "Экран компьютера", который состоит из двух слов.

благодаря

  • 1
    Вы пробовали str.find("Computer screen") ?
  • 0
    Поскольку используется file >> str , str.find("Computer screen") работать не будет.
Показать ещё 2 комментария
Теги:

2 ответа

2
Лучший ответ

file >> str читает параметр (в данном случае строку), ограниченный пробелом. Если вы хотите прочитать всю строку (или, в любом случае, более одного слова одновременно), вы можете использовать оператор getline (по умолчанию строка строки, помеченная символом новой строки).

ifstream file("file.txt");
string str;
while (std::getline (file,str)){
    if (str.find("Computer screen") != string::npos){
         ////
    }
}
  • 0
    Спасибо, я не понимал, что могу использовать getline таким образом. Значит ли это, что getline хранит все из file.txt в str, а затем я ищу str с помощью find?
  • 0
    @ mzee99 Нет. Он читает только одну строку (то есть до следующего символа новой строки '\n' . Поскольку в вашем текстовом файле нет символа новой строки, он читает до конца файла.
Показать ещё 2 комментария
0

Если вы знаете, что есть два слова и что они есть, все, что вам нужно, это следующее:

ifstream file("file.txt");
string str;
while (file >> str){
    if (str.find("Computer") != string::npos){
         file >> str;
         if (str.find("screen") != string::npos) {
         ////
         }         
    }
}

Но, скорее всего, вы просите найти одну строку, которая может быть двумя словами, или тремя или более.

Тогда вы можете рассчитывать на то, что строка находится на одной строке? В этом случае решение @Ashalynd будет работать. Но если строка может быть сломана, она потерпит неудачу. Затем вам необходимо обработать этот случай.

Если ваш файл "маленький", то есть может легко вписываться в память, читать все, удалять разрывы строк и искать строку.

Если он слишком велик, читайте строки в виде пар.

Что-то вроде этого:

std::ifstream file("file.txt");
std::string str[2];
int i = 0;
std::getline (file,str[i]);
++i;
while (std::getline (file,str[i]))
{
    int next_i = (i+1)%2;
    std::string pair = str[next_i] + " " + str[i];
    if (pair.find("Computer screen") != std::string::npos)
    {
        ////
    }
    i = next_i;
}

Все это предполагает, что возможное пустое пространство между словами в строке - это одно пространство или новая строка. Если существует разрыв строки с большим количеством белого пространства (например, вкладки, вам нужно либо заменить белое пространство в строке поиска регулярным выражением для белого пространства, либо реализовать более сложный конечный автомат.

Также подумайте, нужно ли вам управлять случаем, возможно, путем преобразования всех строк в нижний регистр перед совпадением.

  • 1
    Ааа! У нас есть машина состояния сейчас :) ...

Ещё вопросы

Сообщество Overcoder
Наверх
Меню