2010-07-01 5 views
0

J'ai besoin d'une solution pour le tri du fichier pwd unix en utilisant C++ basé sur le nom de famille. Le format du fichier est nom d'utilisateur, mot de passe, uid, gid, nom, homedir, shell. Tous sont séparés par des délimiteurs du côlon. Le champ de nom contient le prénom suivi par le nom de famille séparés par l'espace. Je suis capable de trier les valeurs en utilisant map et je poste mon code. Quelqu'un peut-il me suggérer des améliorations que je peux faire pour mon code s'il vous plaît. Aussi je suis incapable de voir les lignes triées dans mon dossier.trier les chaînes dans un fichier

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; 
    } 

} 

Également j'ai du mal à écrire dans le fichier Je n'arrive pas à voir les résultats triés.

mon problème:

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

Merci & Cordialement,

Mousey.

+0

Définir "très grand". La meilleure façon de trier un fichier de 40 Mo et un fichier de 4 Go est très différente, même si les deux sont sans doute "très gros" pour un fichier pwd. –

+0

Pourquoi avez-vous besoin de le faire en C? L'utilitaire de ligne de commande 'sort' peut probablement résoudre votre problème en un rien de temps. –

+0

suppose que le fichier est de l'ordre de quelques mégaoctets. Je voudrais aussi savoir comment le trier si son ordre de quelques giga octets – mousey

Répondre

5

Depuis le format du fichier est fixe

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

Tenir à jour un std :: carte avec une valeur clé sous forme de chaîne (qui contiendra le nom de famille, et la valeur en tant que numéro de ligne

Commencez à lire le fichier ligne par ligne, extraire le nom (diviser la ligne par « » puis divisé cinquième extrait partie de l'espace).

enregistrer le nom ainsi que le numéro de la ligne sur la carte

Lorsque le fichier complet a été lu, affichez simplement les numéros de ligne comme indiqué sur la carte. (Carte contient les noms lat dans l'ordre de tri)

Pour diviser une chaîne Reportez-vous à

Split a string in C++?

+0

comment trier les chaînes dans une carte? juste en changeant le numéro de ligne?Puisque je ne connais pas l'ordre – mousey

+0

'std :: map' sont des conteneurs triés. –

+0

@mousey, Bye default std :: map stocke les éléments dans un ordre trié (sur les éléments clés qui dans votre cas sont des chaînes). Pour plus de détails sur la carte et son utilisation, consultez: http://www.cplusplus.com/reference/stl/map/ – Pardeep

4

Si c'est seulement quelques méga-octets, vous êtes peut essentiellement slurp en mémoire et utiliser le O(n log n) tri algorithme de votre choix pour le trier, puis écrivez-le.

Fondamentalement, écrivez un extrait de code pour comparer deux lignes comme vous le souhaitez, et utilisez-le avec votre routine de tri de bibliothèque standard pour trier les données. Ou écrivez votre propre routine de tri, peu importe.

Si vous êtes intéressé par la façon dont vous envisagez de gérer des gigaoctets de données, jetez un oeil à l'article de Wikipedia sur External Sorting pour un bon point de départ.

Questions connexes