2013-12-11 24 views
0

我一直在搞一些代碼。我真的只是把事情整理在一起,探索如何從中得到我想要的東西。需要幫助刪除加載的數組並清除它從計數

現在一直困擾着我的是當我嘗試刪除一個用戶時,它將用戶留空而不是完全刪除它。我寧願它完全刪除/刪除該行,並在不刪除任何其他用戶數據的情況下調整計數。編號: 問題是我刪除了一個用戶後。當我列出每個用戶時,它顯示一個空白的用戶:傳遞:等等,而不是列出那些開始。如果我要保存文件,它將有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

讀到你的數據那麼究竟是什麼問題?你沒有指定。有些東西不能正常工作?如果你想要一個代碼審查,請訪問http://codereview.stackexchange.com/ – OldProgrammer

+0

如果你想更新數據文件,你需要寫出所有的記錄 - 當然省略了刪除的記錄。 – suspectus

+0

你是否試圖從一個文件中序列化和反序列化一個類的實例?爲此使用一個庫,比如boost.serialization。如果您推出自己的產品,這種任務可能非常容易出錯。 – polkadotcadaver

回答

0

如果你想只刪除一個條目,不要觸摸任何的其他條目,則需要使用基於節點的容器,例如std::list<T>std::map<K, V>(後者將滿足您通過密鑰定位對象的需求)。

這就是說,如果你想堅持的數組,並填補了國內空白,你有兩個原則選擇:

  1. 如果你不關心對象的順序,你可以只std::swap()的用最後一個副本刪除要刪除的對象,然後刪除最新的最後一個元素。
  2. 如果訂單對您而言非常重要,您需要在間隙前移動所有對象。最簡單的方法是使用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; 
} 
+0

謝謝。我之前沒有聽說過地圖,那是可行的。到目前爲止只做了一點,但我遇到了一個問題。我用extern map userdb;這是一個問題。我之前使用它的字符串加載它,它工作正常。有任何想法嗎?該代碼使用,而不是eof幫助解決我遇到的一個保存問題。謝謝你,先生。 – user3088464

+0

nvm我得到的地圖工作在與外部其他文件,只是缺少#include 和命名空間 – user3088464

0

不是清除在位置x的元素,使用擦除向量(必須標準::載體,而不是C-陣列)