我一直在搞乱一些代码。我真的只是把东西混在一起,并探索如何从中得到我想要的东西。
现在困扰我的是,当我尝试删除用户时,它会将用户留空,而不是完全删除它。我宁愿它完全删除/删除该行并调整计数而不删除任何其他用户数据。
编辑: 问题是我删除用户后。当我列出每个用户时,它会显示一个空白的用户:传递:等,而不是列出那些开头的用户。如果我要保存文件,它将有5个空格。我宁愿它完全删除这些线条,好像它们从未在那里开始。
这是我加载代码的方式:
int Loadpdata()
{
ifstream fp_in;
if(count > 0)
{
cout << "pdata already Loaded.\nTotal of " << count << " users loaded." << endl;
return 0;
}
fp_in.open("p.data"); //Open user file
if(fp_in == NULL)
{
cout << "Could not open user file, exiting." << endl;
}
while(!fp_in.eof()) { //While there is something to read
getline(fp_in,userd[count]);
getline(fp_in,passd[count]); //Read a line from the file
getline(fp_in,aged[count]); //Read a line from the file
getline(fp_in,locationd[count]); //Read a line from the file
getline(fp_in,emaild[count]); //Read a line from the file
getline(fp_in,mid[count]); //Read a line from the file
cout << "User: " << userd[count] << " Loaded Successfully." << endl;
userstotal++;
count++;
}
fp_in.close(); //Done with the user file
cout << "Total Users Loaded: " << count << endl;
if(!count > 0)
{
cout << "Userlist is empty, exiting" << endl;
return -2;
}
return 0;
}
现在这就是我删除用户的方式:
int Deletedata()
{
char user[80];
int logged_in=0;
while(!logged_in) { //Force user to login. Give a quit option if you'd like
cout << "Enter user name: ";
cin >> user;
int found = 0;
for(int x=0;x<count && !found;x++) { //For each user/password pair..
if(userd[x].compare(user) == 0) { //Matched the username
found = 1;
logged_in = 1;
userd[x].clear();
passd[x].clear();
aged[x].clear();
locationd[x].clear();
emaild[x].clear();
mid[x].clear();
}
}
if(!found) {
cout << "Invalid username!" << endl;
}
}
//Once we're done with that loop, they logged in successfully.
cout << "Deleted " << user << " Successfully." << endl;
return 0;
}
我越想到这一点,我越发现我可能不得不废弃它并提出新的格式。
答案 0 :(得分:0)
不要清除位置x处的元素,而是在向量上使用erase(必须是std :: vector,而不是C数组)
答案 1 :(得分:0)
如果您只想删除一个条目而不触及任何其他条目,则需要使用基于节点的容器,例如std::list<T>
或std::map<K, V>
(后者)无论如何都会满足你通过键定位对象的需要。)
也就是说,如果你想坚持使用数组并填补空白,你有两个原则选择:
std::swap()
使用最后一个副本删除要删除的对象,然后删除最后一个元素。std::remove_if()
。 BTW,尝试阅读文件并检查in.eof()
不是否可靠。特别是,当没有更多对象时eof()
可能是true
,也可能不是eof()
,并且在读取后,您是否读取成功。另请注意,true
可能永远不会变为while (std::getline(in, userd[count])
&& std::getline(in, passd[count])
// ...
&& std::getline(in, mid)) {
++count;
}
,例如,如果文件包含格式错误并进入失败状态。您应该使用类似
{{1}}