Сравнить слова (лексемы) вводимого текста со словами из текстового файла

106
21 ноября 2020, 09:10

Надо сравнить лексемы вводимого текста с лексемами из текстового файла и выводить следующую строку от найденной лексемы. Но не удаётся вывести. Почему?

Пробую так:

#include <iostream>
#include <string>
#include <vector>
#include <sstream>
#include <fstream>
using namespace std;
int main()
{
    string text;
    string word;
    char buffer[200];
    //----------------Работа с вводимым текстом-------------------------------
    getline(cin, text);
    stringstream buff(text);
    vector <string> vectext;
    while(buff >> word) vectext.push_back(word);
    //unsigned int vector_size = vectext.size(); 
    //--------------------------Работа с текстовым файлом---------------------
    ifstream fin("text.txt");
     if (!fin.is_open()) 
            cout << "Файл не может быть открыт!\n";
        }
       while (fin >> word) 
        for (int i = 0; i < vectext.size(); i++) 
            if (word == vectext[i]) 
            { 
            getline(fin,word);// не выводит, а если через fin >> word, то работает.
            cout << word << endl;
            break;
            }
    return 0;
}
Answer 1

Похоже, что мне проще объяснить, написав работающий код на основе вашего (насколько я понял все условия (в т.ч. озвученные в комментариях)).

Итак, программа вводит строку содержащую список поисковых слов (лексем, в вашей терминологии).
Затем она читает файл вот в таком формате:

avp@avp-ubu1:hashcode$ cat text.txt
b1 aa
line 1 text...
b2 
line 2 text... word1 word2 word3
b3 bbb
line 3 text...
b4
line 4 word1 word2 word3
avp@avp-ubu1:hashcode$ 

Четные строки файла содержат список лексем, "адресующих" следующую строку.

Программа должна напечатать те строки (вместе с их порядковыми номерами) этого файла, для которых хотя бы одна из лексем, введенных со стандартного ввода совпала хотя бы с одной из "адресующих" строку лексем.

#include <iostream>
#include <string>
#include <vector>
#include <sstream>
#include <fstream>
using namespace std;
int main (int ac, char *av[])
{
  string text;
  string word;
  char buffer[200];
  //----------------Работа с вводимым текстом-------------------------------
  getline(cin, text);
  stringstream buff(text);
  vector <string> vectext;
  while (buff >> word)
    vectext.push_back(word);

  //--------------------------Работа с текстовым файлом---------------------
  ifstream fin(av[1] ? av[1] : "text.txt");
  if (!fin.is_open()) 
    cout << "Файл не может быть открыт!\n", exit(1);
  int lineno = 0;
  while (getline(fin, text)) { // читаем строку лексем
    lineno++;
    string text2;
    if (getline(fin, text2)) { // читаем следующую строку, с которой связаны лексемы
      lineno++;
      stringstream lwords(text);
      bool found = false;
      while (!found && lwords >> word) // перебираем лексемы связанные со строкой
        for (int i = 0; !found && i < vectext.size(); i++)
          if (vectext[i] == word) { // сравниваем с лексемами в введенном тексте
            found = true;
            cout << lineno << ": " << text2 << '\n';
            cout << "found by '" << word << "'\n\n";
          }     
    } else
      cout << "error in file format\n";
  }
  return 0;
}

Пример запуска:

avp@avp-ubu1:hashcode$ g++ t.cpp && ./a.out
bbb b1 b2
2: line 1 text...
found by 'b1'
4: line 2 text... word1 word2 word3
found by 'b2'
6: line 3 text...
found by 'bbb'
avp@avp-ubu1:hashcode$ 

Если что-то неясно, спрашивайте.

READ ALSO
Сортировка однонаправленного списка С++

Сортировка однонаправленного списка С++

помогите мне отсортировать список по имени, я понятия не имею как его нормально отсортировать

103
Взаимодействие формы и виджета карты на ней

Взаимодействие формы и виджета карты на ней

Столкнулся с такой задачей как сделать форму, на которой, например, есть два виджета LineEdit и виджет карты (я взял QWebWidget и открыл в нем ЯндексКарты)

95
C++ atomic: ошибка LLVM из NDK

C++ atomic: ошибка LLVM из NDK

При включении любых C++ заголовков появляется ошибка в заголовках LLVM:

124