5 votes

confusion au sujet des listes et des paires

J'essaie donc d'ajouter les noms et prénoms dans une liste doublement liée. J'ai plusieurs fichiers texte de différentes longueurs avec le format "string, string", et j'utilise list> pour stocker mes données.

J'utilise ce code :

typedef std::list< std::pair<string,string> > listPair;

...

list<pair<string, string> > mylist;
ifstream myFile; 
myFile.open("20.txt");

pair<string, string> stuff;
while (myFile >> stuff.first >> stuff.second)
{
    mylist.push_back(stuff);
}

listPair::iterator iter = mylist.begin();

for(;iter != mylist.end();iter++)
{
    string s = (*iter).first;
    cout << s << endl;
    string c = (*iter).second;
    cout << c << endl;
}

Le problème que je rencontre est le suivant : tout d'abord, le dernier élément de la liste n'est pas ajouté. comme si chaque fichier manquait la dernière ligne, donc c'est un peu confus.

De plus, je fais un "mylist.size()" pour m'assurer que tous les noms ont été ajoutés, et cela m'embrouille parce que disons que pour un fichier texte contenant 99 noms, c'est-à-dire 99 lignes de texte, il dira (sans oublier qu'il ne lit que 98 en raison de l'absence de la dernière ligne) que la liste a une taille de 48.

POURQUOI 48 ? Est-ce quelque chose à faire parce que j'ai fait des paires, ce qui n'aurait toujours pas de sens car si ce n'était pas lu en paires, il y aurait en fait le double, puisque les paires sont juste pour prendre le nom et le prénom comme une seule valeur.

Ça me dépasse.

Encore une fois, merci pour toute votre aide !

5voto

Joseph Mansfield Points 59346

J'ai le sentiment que votre fichier n'a pas réellement d'espaces entre les valeurs comme vous l'avez décrit, il ressemble donc à ceci :

one,two
three,four
five,six
seven,eight
nine,ten

Si vous exécutez votre programme là-dessus, la taille de l'échantillon list sera de 2 ( floor(number_of_lines/2) ce qui, pour vous, donnerait 48) et la dernière ligne n'aura pas été mise dans le fichier d'échange de données. list du tout. Pourquoi ?

Tout d'abord, chaque appel à std::ifstream::operator>>(std::string&) s'extraira jusqu'à ce qu'il rencontre un espace blanc. Dans ce cas, le premier espace blanc de la première ligne est l'élément suivant \n à la fin de celui-ci. Donc, lors de la première itération, stuff.first sera "one,two" et ensuite la ligne suivante sera lue dans stuff.second ce qui en fait "three,four" . Celle-ci est ensuite poussée dans le list . Les deux lignes suivantes se lisent de la même manière, ce qui donne la paire {"five,six","seven,eight"} . À l'itération suivante, la première operator>> extraira "nine,ten" et la seconde échouera, provoquant la while à la fin de la condition et la dernière ligne à rejeter.

Même si vous aviez des espaces, vous vous retrouveriez avec des virgules dans le fichier first de chaque pair ce qui n'est certainement pas ce que vous souhaitez.

La meilleure façon d'aborder un problème comme celui-ci est d'utiliser std::getline pour extraire une ligne, et ensuite analyser cette ligne comme il se doit :

std::string line;
std::pair<std::string, std::string> line_pair;
while (std::getline(myFile, line)) {
  std::stringstream line_stream(line);
  std::getline(line_stream, line_pair.first, ',');
  std::getline(line_stream, line_pair.second);
  mylist.push_back(line_pair);
}

Je recommande également d'utiliser std::vector sauf si vous avez une bonne raison d'utiliser std::list .

-1voto

gerrytan Points 10345

L'opérateur >> sur ifstream traite la nouvelle ligne comme un autre jeton. Par conséquent, il lira probablement le premier et le deuxième mot comme d'habitude à partir de la première ligne, mais le troisième jeton lu est la nouvelle ligne sur la première ligne.

Essayez d'utiliser getline pour "manger" la nouvelle ligne également.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X