pooher Ответов: 2

Как читать текстовый файл и сравнивать строки с помощью C++ и выполнять блоки кода.


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

Что я уже пробовал:

#include <iostream>
#include <fstream>
#include <string>

using namespace std;

int main()
{

    fstream newfile;

    string query,user;
    cout<< "enter query\n";
    getline(cin,query);

    cout<< "enter username\n";
    getline(cin,user);

    newfile.open("users.txt",ios::in); 
    if (newfile.is_open()){ 
    string tp;
    while(getline(newfile, tp)){ 
         //cout << tp << "\n"; 
       if (tp.compare(user)!= string::npos)
         {
             cout << query<<"\n";
          //   found = true;
          break;
         }
         else
            {
                cout << "print something";
         }

      }
   }
      newfile.close();



Мой текстовый файл содержит следующие данные
user1 , include
user2 , exclude
user3 , include

Примечание: когда пользователь предоставляется в качестве входных данных и файл имеет имя пользователя вместе с включением если блок должен выполняться или в противном случае блок должен выполняться

2 Ответов

Рейтинг:
1

CPallini

Я бы использовал std::set для хранения "включенных" пользователей:

#include <iostream>
#include <fstream>
#include <string>
#include <set>

using namespace std;

int main()
{
    set<string> included_user;

    string query,user;

    cout<< "enter query\n";
    getline(cin,query);

    cout<< "enter username\n";
    getline(cin,user);

    { // read the file and fill the set of 'included' users
      ifstream newfile( "users.txt");
      do
      {
        string name, comma, inclusion;
        newfile >> name >> comma >> inclusion;
        if ( inclusion == "include")
          included_user.insert(name);
      } while (newfile);
    }

    // conditiona execution here
    if (included_user.count(user) > 0)
    {
      cout << query<<"\n";
    }
    else
    {
      cout << "print something\n";
    }
}


Espen Harlinn

Красиво и просто :-)

CPallini

Спасибо!

pooher

Это только печать блок else, и не если заблокировать, также имеет значение. Не могли бы вы, пожалуйста, помочь мне в этом.

CPallini

Набор не должен быть пустым (и он должен выполнять блок "если" с соответствующим вводом). Я проверил его с помощью вашего входного файла.

pooher

на самом деле происходит следующее: имя имеет первые строки текстового файла, запятая-вторую строку текстового файла, а включение-третью строку текстового файла. Для каждого ввода он печатает содержимое блока else :(.

Рейтинг:
1

Richard MacCutchan

То string::compare функция возвращает одно из трех значений, как описано в разделе элементах класса | Майкрософт документы[^Это то, что вы должны проверить против.

[редактировать]
Также вам нужно извлечь имя пользователя из текста, прочитанного из файла. Если вы сравните "user1" с "user1 , include", он никогда не будет совпадать.
[/редактировать]


pooher

Не могли бы вы, пожалуйста, позволить мне опубликовать некоторый код, если это возможно, так как я новичок в C++ и пытаюсь найти ответы