如何在文件中搜索关键字,然后打印包含在其中的字符串?

时间:2015-04-21 01:31:26

标签: c++ file

我正在制作电话簿。一旦用户输入了他们的数据,它就将所有数据保存为单个字符串(姓名,地址,电话号码,电子邮件)。我是C ++的新手。任何帮助都感激不尽。谢谢。

有两个主要问题:

  1. 第一次联系人保存到文件后,正在进行的联系人不会显示在文件中

  2. 我想这样做,以便用户可以搜索他们作为联系人一部分输入的名称或一个关键字,并获取包含所有信息的整个字符串。我怎样才能做到这一点?


  3. #include <iostream>
    #include <string> 
    #include <ostream> 
    #include <fstream>   
    using namespace std;
    
    struct person{
        string Name;
        string Address;
        string PhoneNumber;
        string Email;
    };
    
    int main() {
    
        ResetUserSelection: 
        int userselection = 0;
    
        cout << "Press 1 to Add Contact" << endl;
        cout << "Press 2 to Search for Contact"<<endl;
        cout << "What do you want to do? ";
        cin >> userselection;
    
        if(userselection == 1) {   
            person newPerson;
    
            cout << endl << "What is your Name? ";   
            cin >> newPerson.Name;
    
            cout << "What is your Address? " ;
            cin >> newPerson.Address;
    
            cout << "What is your Phone Number? " ;
            cin >> newPerson.PhoneNumber;     
    
           cout << "What is your Email? ";
           cin >> newPerson.Email;
           cout << endl;
    
           cout << newPerson.Name<<"'s contact info"<<endl;
           cout << "Name : " << newPerson.Name <<endl;
           cout << "Address : " << newPerson.Address <<endl;
           cout << "Phone Number : " << newPerson.PhoneNumber <<endl;
           cout << "Email : " << newPerson.Email <<endl;
           cout << endl;
    
           string fullContact = newPerson.Name + " " + newPerson.Address + " " +       newPerson.PhoneNumber + " " + newPerson.Email; 
           ofstream myfile;
           myfile.open ("contactlist.txt");
           myfile << fullContact;
           myfile.close();
           goto ResetUserSelection;
        } 
        else { 
            string search;
            ifstream Myfile;
            Myfile.open ("contactlist.txt");
            cout << "Who do you want to search for?" << endl;
            cin >> search;
    
            //i do not know what to do here
    
            goto ResetUserSelection;
        }
    }
    

2 个答案:

答案 0 :(得分:0)

您的代码存在多个问题:

  1. 当您打开文件时,不会向其添加新数据,而是替换它。所以每次文件中只有1条记录。你需要在附加模式下打开文件,比如这个

    myfile.open ("contactlist.txt", ios::app);
    
  2. 您不会将记录分开,可能您希望在将联系人写入文件时添加\n,并添加,之类的内容来分隔其字段。

    string fullContact = newPerson.Name + "," + newPerson.Address + "," + newPerson.PhoneNumber + "," + newPerson.Email + "\n";
    
  3. 您无法在名称或地址中添加与空格的联系。原因是您使用operator >>。您可以将其替换为getline函数(但您需要在首次阅读操作后添加cin.ignore(256, '\n');,请参阅this

    cin >> userselection;
    cin.ignore(256, '\n');
    
    if(userselection == 1) {
        cout << "What is your Name? ";
        getline(cin, newPerson.Name);
    
        cout << "What is your Address? " ;
        getline(cin, newPerson.Address);
    
        cout << "What is your Phone Number? " ;
        getline(cin, newPerson.PhoneNumber);
    
        cout << "What is your Email? ";
        getline(cin, newPerson.Email);
    
        ....
    }
    
  4. 回答有关如何实施搜索的主要问题。一种方法是打开文件,逐行读取,搜索出现的搜索字符串,如果找到它 - 打印

    ifstream myfile;
    myfile.open ("contactlist.txt");
    string contact;
    while(getline(myfile, contact)) {
        if(contact.find(search) != string::npos) {
            cout << contact << endl;
        }
    }
    myfile.close();
    

    您也可以将cin >> search;替换为getline(cin, search);

答案 1 :(得分:0)

不完全是答案,但为您的计划提供了一些提示。

如果您想编写管理电话簿的应用程序,您必须:

  • 识别您要存储的信息(此处为姓名,地址,电话号码,电子邮件),并为每个信息定义格式(数字与字符串,大小,字符串允许的字符,大小写转换......)
  • 定义存储格式(文本,二进制),并确保在文本格式的情况下,您的信息格式不会模糊不清

在这里,您使用空格作为分隔符,但您似乎不禁止名称或地址中的空格。第二个要求没有得到满足,你肯定会遇到麻烦。您最好将{@ 1}}或|等信息中不太可能出现的字符用作分隔符。或者,您可以研究CSV格式如何处理转义特殊字符。

除了Nikolai所说的在附加模式下打开文件的问题之外,我强烈建议您使用换行作为记录分隔符并使用;作为字段分隔符,并确保两个字段都不能包含这些分隔符。

由于您希望能够搜索您的电话簿,我还建议您以大写形式存储名称(或全部小写而不是混合):比较将更容易,如果您以后使用数据库,它将是正确索引的要求。