Как получить всю строку, где находится данное слово, и сохранить его в переменной? - PullRequest
2 голосов
/ 02 сентября 2011

Я новичок в мире C ++, мне нужно получить всю строку, где находится данное слово, и сохранить его в переменной.

my TXt file has this structure :
clients.txt
085958485 Roland Spellman rolandl@gmail.com 
090545874 KATHLEEN spellman kathleen1@hotmail.com 
056688741 Gabrielle Solis desperate@aol.com 

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

Я знаю, как найти слово в текстовом файле.но я не знаю, как получить всю строку в переменную.поэтому в конце моя переменная должна хранить

variable = 090545874 KATHLEEN spellman kathleen1@hotmail.com 4878554

, после этого я могу удалить всю строку или запись.Я использую этот код для ввода данных в текстовый файл

      struct person{       

      char id[10];
      char name[20];
      char lastname[20];
      char email[10];
      } clientdata;

      ofstream clientsfile;
      clientsfile.open ("clientes.dat" , ios::out | ios::app);


      if (clientsfile.is_open())
      {
      cout<<"   ENTER THE ID"<<endl;
      cin>>clientdata.id;
      clientsfile<<clientdata.id<<" ";                              

      cout<<"   ENTER THE NAME"<<endl;
      cin>>datoscliente.name;
      clientsfile<<clientdata.name<<" ";

      cout<<"   ENTER THE LAST NAME"<<endl;
      cin>>clientdata.lastname;
      clientsfile<<clientdata.lastname<<" ";

      cout<<"   ENTER THE LAST EMAIL"<<endl;
      cin>>clientdata.email;
      clientsfile<<clientdata.email<<" ";

, затем я прошу ЕС ввести идентификатор, и что мне нужно сделать, это не найти только идентификатор, это получить целоестрока, где идентификатор так, если пользователь вводит 090545874, мне нужно найти его в текстовом файле, но мне нужно получить всю строку в этом случае 090545874 KATHLEEN spellman kathleen1@hotmail.com, поэтому мне нужно сохранить его в новомпеременная строка newvariable;newvariable = 090545874 КЭТЛИН заклинатель kathleen1@hotmail.com

Ответы [ 5 ]

2 голосов
/ 02 сентября 2011

Чтобы читать файлы по одной строке за раз, вы можете использовать функцию std::getline, определенную в заголовке <string> (я предполагаю, что вы также используете библиотеку fstream):

#include <fstream>
#include <string>

int main(int argc, char** argv) {
    std::ifstream input_file("file.txt");
    std::string line;

    while (true) {
        std::getline(input_file, line);
        if (input_file.fail())
            break;

        // process line now
    }

    return 0;
}

Что приятно в функции std::getline, так это то, что она допускает такой более чистый синтаксис:

#include <fstream>
#include <string>

int main(int argc, char** argv) {
    std::ifstream input_file("file.txt");
    std::string line;

    while (std::getline(input_file, line)) {
        // process line now
    }

    return 0;
}
1 голос
/ 05 сентября 2011

спасибо всем за ваши ответы, я наконец понял это, я использовал эту функцию:

bool mostshow(int option, string id)
{
 if (option== 2 && id== id1)
 return true;

 if (option== 3 && id== id1)
 return true;

 return false;

}

and this other one

void showline(string field1, string field2, string field3, string field4, string field5, string field6,    string field7)
{   
string store;
store = field1+" "+field2+" "+field3+" "+field4+" "+field5+" "+field6+" "+field7;

cout<<endl;
}

and then in the main 

ifstream myfile("clients.dat", ios::in);    
                  if (!myfile)
                     {
                     cerr <<"   CANNOT OPEN THE FILE!!"<<endl;
                     exit(1); 
                     }

                  option=2;

                  myfile >> field1 >> field2 >> field3 >> field4 >>field5 >> field6 >> field7;



                  while (!myfile.eof())
                  {
                        if (mostshow(option, id))
                           {
                            showline(field1, field2, field3, field4, field5, field6, field7);
                           }


                  myfile >> field1 >> field1 >> field1 >> field1 >>field1 >> field1 >> field1;

                  } 

                  myfile.close();  

переменная-опция является частью оператора switch, который спрашивает, хотите ли вы удалить или изменить запись, 2 означает изменение, 3 удаление

0 голосов
/ 02 сентября 2011

Вы можете создать структуру и прочитать ее в данных, перегрузив оператор извлечения потока:

struct Record
{
    unsigned int id;
    std::string first_name;
    std::string last_name;
    std::string email_addr;

    friend std::istream& operator>>(std::istream& input, Record& r);
};

std::istream& operator>>(std::istream& input, Record&r)
{
    input >> r.id;
    input >> r.first_name;
    input >> r.last_name;
    getline(input, r.email_addr);
    return input;
}

Редактировать 1: Использование:

ifstream input_file("mydata.text");
Record r;
std::map<unsigned int, Record> container;
while (input_file >> r)
{
    unsigned int id = r.id;
    container[id] = r;
}

Что касается хранилища, посмотрите на структуру std::map, скопируйте поле идентификатора и используйте его в качестве ключа.

Я все еще предполагаю, что эта работа является лучшим кандидатом для базы данных или электронной таблицы.

0 голосов
/ 02 сентября 2011

Используйте ifstream, getline и unordered_map:

#include <fstream>
#include <string>
#include <sstream>
#include <exception>
#include <unordered_map>

using namespace std;

ifstream infile("mytextfile.txt");

if (!infile) {
    cerr << "Failure, cannot open file";
    cin.get();
    return 0;
}

unordered_map<string, string> id2line;
string id, line;

while (getline(infile, line)) {
    stringstream strstm(line);
    strstm >> id;
    id2line[id] = line;
}

Теперь вы можете сделать

cout << "Please enter an id: " << endl;

string id;
cin >> id;

try {
    // unordered_map::at throws an std::out_of_range exception when the key doesn't exist
    string line = id2line.at(id);
    cout << "Info:\n    " << line << endl;
} catch (out_of_range& e) {
    cout << "No information by that id." << endl;
}
0 голосов
/ 02 сентября 2011

Вы не сказали, как читаете файл, но функция fgets сделает то, что вы хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...