2010-07-01 27 views
0

我需要一個解決方案,使用基於姓氏的C++對unix pwd文件進行排序。該文件的格式是用戶名,密碼,uid,gid,名稱,homedir,shell。所有分隔符都用冒號分隔。名稱字段包含姓氏後綴的名字,這兩個名字都是由空格分隔的,我可以使用地圖對值進行排序,併發布我的代碼。可以有人建議我改進,我可以做我的代碼請。此外,我無法看到我的文件中的排序行。排序文件中的字符串

string line,item; 
fstream myfile("pwd.txt"); 
vector<string> lines; 
map<string,int> lastNames; 
map<string,int>::iterator it; 

if(myfile.is_open()) 
{  
    char delim =':'; 
    int count =0; 
    while(!myfile.eof()) 
    { 
    count++; 
    vector<string> tokens; 
    getline(myfile,line); 
    istringstream iss(line); 

    lines.push_back(line); 

    while(getline(iss,item,delim)) 
    { 
     tokens.push_back(item); 
    } 
    cout<<tokens.size()<<endl;; 
    size_t i =tokens[4].find(" "); 
    string temp = tokens[4].substr(i,(tokens[4].size()-i)); 
    cout<<temp<<endl; 

    lastNames.insert(pair<string,int>(temp,count)); 
    tokens.clear(); 

    } 

    myfile.seekg(0,ios::beg); 

    for(it=lastNames.begin();it!=lastNames.end();it++) 
    { 
     cout << (*it).first << " => " << (*it).second << endl; 
     int value=lastNames[(*it).first ]; 
     myfile<<lines[value-1]<<endl; 
     cout<<lines[value-1]<<endl; 
     cout<<value<<endl; 
    } 

} 

另外我有問題寫入文件我無法看到排序結果。

我的問題:

Can someone please explain me why I am unable to see the written results in the file! 

感謝&問候,

像老鼠。

+0

定義「非常大」。對40MB文件和4GB文件進行排序的最佳方法是非常不同的,儘管對於pwd文件來說這兩個文件都可以說是「非常大」。 – 2010-07-01 04:16:07

+0

爲什麼你需要在C中做到這一點?命令行'sort'實用程序可以很快解決您的問題。 – 2010-07-01 04:16:24

+0

假設該文件是在幾兆字節的順序。我也想知道如何排序它,如果它的幾個千兆字節的順序 – mousey 2010-07-01 04:17:24

回答

5

由於文件的格式是固定的

username, password, uid, gid, first name(space)lastname, homedir, shell 

保持一個std ::地圖鍵值爲字符串(它將包含姓和值作爲行號

開始讀取文件逐行提取姓(分割由線「」,然後分裂第五提取空間部分)。

店鋪在地圖行號沿名稱

完成文件讀取後,只需輸出地圖中提到的行號。 (Map包含在有序LAT名)

對於分割字符串 參考

Split a string in C++?

+0

如何對地圖中的字符串進行排序?只是通過改變行號?由於我不知道訂單 – mousey 2010-07-01 04:29:16

+0

'std :: map'是已排序的容器。 – 2010-07-01 04:41:06

+0

@mousey,Bye默認std :: map按排序順序存儲元素(在你的情況下是字符串的關鍵元素)。有關地圖及其用法的更多詳細信息,請參閱:http://www.cplusplus.com/reference/stl/map/ – Pardeep 2010-07-01 04:48:39

4

如果只有幾兆,你可以基本上它啜入內存,並使用O(n log n)排序您選擇的算法對其進行排序,然後將其寫出。

基本上,編寫一段代碼片段,以您想要的方式比較兩行,並將其與您的標準庫排序例程一起用於排序數據。或者寫你自己的排序程序,不管。

如果您對如何處理千兆字節的數據感興趣,請參閱維基百科關於External Sorting的文章,以獲取良好的起點。