在我的程序中,我有一个存储名称列表的文件。我还有一种删除这些名称的方法 - 将文件内容写入向量,然后从向量中删除名称,然后将向量的内容写回文件。当用户想要添加名称时,文件会附加它。我的问题是,当我尝试取出一个条目并用剩下的任何内容替换文件时,它会将其附加到文件中。 因此,例如,如果一个名称是 Admin,另一个名称是 User,如果用户试图删除 Admin,则结果如下所示:
-- Admin --
-- User --
-- User --
保留Admin和User,并附加擦除用户的结果
这是我的代码:
void create_password()
{
string holder;
string keeper;
vector<string> delete_entry;
vector<string>::iterator new_end;
ofstream New_PasswordFile(new_password_name + ".txt");//Creates a file called *name*.txt(used to store password for given name)
ofstream Display_File; //Saves name to another file, which is diplayed to the user, when they attempt to retrieve a passwords
//Display file is the file with all of the names
Display_File.open(stored_username + "names.txt", ios_base::app);
//Appends to the file instead of recreating it.
ifstream Display_File_Checker(stored_username + "names.txt");
//Opens same file under different name
if(is_same_entry != true){//if a new entry is inputed
Display_File << "\n-- " << new_password_name << " --\n"; //Inputs the new name into the file with -- *name* --
}
cout<<"WHAT IS THE PASSWORD?"; //Prompts to input password to save to the *name*
cin >> new_password;
if (new_password == "DELETE"){//if inputed password for given entry is delete
new_password = "";
while (getline (Display_File_Checker, holder))
delete_entry.push_back(holder);//Adds display to vector delete_entry
for (int i = 0; i < delete_entry.size(); i++) {
if(delete_entry[i] == "-- " + new_password_name + " --"){
cout << "working" << endl;
new_end = remove(delete_entry.begin(), delete_entry.end(), "-- " + new_password_name + " --");
delete_entry.erase(new_end,delete_entry.end()); //erase the entry
}
}
//write contents of new_end to entry file
for (int i = 0; i < delete_entry.size(); i++){
keeper = delete_entry[i];
cout << "keeper :" << keeper << endl; //<< endl;
Display_File << keeper << endl; //appends instead of overwriting.
}
Display_File.close();
}
我尝试不附加到文件,但用户无法添加条目。我不确定是否有办法对此进行编码,或者是否有合乎逻辑的方法来执行此操作。
是的,您正在混合几个应该分开的操作。
如果你想就地更新文件——这就是数据库的目的。如果您正在考虑,sqlite3 将是一个很好的解决方案
然而,这里的典型解决方案是:
将整个文件加载到内存中,可能会加载到(哈希)映射中
做你需要的操作-增/删/改
将整个地图写回文件。