【发布时间】:2020-12-17 09:03:44
【问题描述】:
这里我有一个读入向量的文件
typedef struct contacts
{
string name; //{jhonathan , anderson , felicia}
string nickName; //{jhonny , andy , felic}
string phoneNumber; // {13453514 ,148039 , 328490}
string carrier; // {atandt , coolmobiles , atandt }
string address; // {1bcd , gfhs ,jhtd }
} contactDetails;
vector <contactDetails> proContactFile;
我想让用户从文件中删除联系人记录。为此我编写了一个代码。但是从我编写的代码中它会从文件中删除所有联系人详细信息。但我想要的是什么时候用户键入 name 然后程序应该只删除 name 并且相关的 nickname,carrier,phone number 和 address 属于该名称。这是我编写的代码
string readString, selectContact;
cout << "Enter the name you want to delete" << endl;
cin >> selectContact;
ifstream fin;
fin.open(contactsFile);
if (!fin.is_open())
{
cout << "Unable to open Contacts.csv, please make sure file exists!" << endl;
}
ofstream fout;
fout.open("temp.csv" , ios::out);
while (getline(fin, readString))
{
if (((readString = readString.find(selectContact), 0)) == 0)
{
fout << readString <<',' << "\n";
}
cout << "Deleted Successfully" << endl;
showTableContacts();
}
if (((readString = readString.find(selectContact), 0) != 0))
{
cout << "\n" << selectContact << " not found" << endl;
}
fout.close();
fin.close();
remove("Contact.csv");//Deletes contacts.csv file
rename("temp.csv" , "Contact.csv");//Rename temp file as Contacts.csv
}
【问题讨论】:
-
我很惊讶
readString = readString.find编译,它几乎肯定不会像你想象的那样做 -
string::find()返回一个size_t。所以if (((readString = readString.find(selectContact), 0)) == 0)并没有按照你的想法去做。此外,在执行文件操作时,您的代码会继续出现一些错误 - 这意味着它将删除原始的Contact.csv并将其替换为错误之前输出到temp.csv的任何内容。 -
@Peter 那么请你帮我一个更好的方法吗?
-
执行此操作的直接方法:为您的结构联系人定义 > 运算符(对于 iostream 的读\写),通过 std::copy 将文件读入向量,使用 std::remove_if 和 std ::erase 从向量中删除元素,再次使用 std::copy 将向量写入文件