我正在制作电话簿。一旦用户输入了他们的数据,它就将所有数据保存为单个字符串(姓名,地址,电话号码,电子邮件)。我是C ++的新手。任何帮助都感激不尽。谢谢。
有两个主要问题:
第一次联系人保存到文件后,正在进行的联系人不会显示在文件中
我想这样做,以便用户可以搜索他们作为联系人一部分输入的名称或一个关键字,并获取包含所有信息的整个字符串。我怎样才能做到这一点?
#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;
}
}
答案 0 :(得分:0)
您的代码存在多个问题:
当您打开文件时,不会向其添加新数据,而是替换它。所以每次文件中只有1条记录。你需要在附加模式下打开文件,比如这个
myfile.open ("contactlist.txt", ios::app);
您不会将记录分开,可能您希望在将联系人写入文件时添加\n
,并添加,
之类的内容来分隔其字段。
string fullContact = newPerson.Name + "," + newPerson.Address + "," + newPerson.PhoneNumber + "," + newPerson.Email + "\n";
您无法在名称或地址中添加与空格的联系。原因是您使用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);
....
}
回答有关如何实施搜索的主要问题。一种方法是打开文件,逐行读取,搜索出现的搜索字符串,如果找到它 - 打印
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所说的在附加模式下打开文件的问题之外,我强烈建议您使用换行作为记录分隔符并使用;
作为字段分隔符,并确保两个字段都不能包含这些分隔符。
由于您希望能够搜索您的电话簿,我还建议您以大写形式存储名称(或全部小写而不是混合):比较将更容易,如果您以后使用数据库,它将是正确索引的要求。