需要帮助删除已加载的数组并从计数清除它

时间:2013-12-11 21:34:16

标签: c++ arrays count

我一直在搞乱一些代码。我真的只是把东西混在一起,并探索如何从中得到我想要的东西。

现在困扰我的是,当我尝试删除用户时,它会将用户留空,而不是完全删除它。我宁愿它完全删除/删除该行并调整计数而不删除任何其他用户数据。

编辑: 问题是我删除用户后。当我列出每个用户时,它会显示一个空白的用户:传递:等,而不是列出那些开头的用户。如果我要保存文件,它将有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;


}

我越想到这一点,我越发现我可能不得不废弃它并提出新的格式。

2 个答案:

答案 0 :(得分:0)

不要清除位置x处的元素,而是在向量上使用erase(必须是std :: vector,而不是C数组)

答案 1 :(得分:0)

如果您只想删除一个条目而不触及任何其他条目,则需要使用基于节点的容器,例如std::list<T>std::map<K, V>(后者)无论如何都会满足你通过键定位对象的需要。)

也就是说,如果你想坚持使用数组并填补空白,你有两个原则选择:

  1. 如果您不关心对象的顺序,您可以std::swap()使用最后一个副本删除要删除的对象,然后删除最后一个元素。
  2. 如果订单对您很重要,您需要在差距向前移动所有对象。最简单的方法是使用std::remove_if()
  3. BTW,尝试阅读文件并检查in.eof() 是否可靠。特别是,当没有更多对象时eof()可能是true,也可能不是eof(),并且在读取后,您是否读取成功。另请注意,true可能永远不会变为while (std::getline(in, userd[count]) && std::getline(in, passd[count]) // ... && std::getline(in, mid)) { ++count; } ,例如,如果文件包含格式错误并进入失败状态。您应该使用类似

    的内容来读取数据
    {{1}}