2016-07-17 1 views
-3

mon problème est:
ifstream me donne seulement 16 élémentsifstream me donne seulement 16 éléments

Salut, Dans mon C++ code que j'ai plusieurs classes. Ils sont:
-Data (Inclure quelques chiffres)
-Towns (Inclure au moins 2 données -Objets (dans un vecteur), et le nom d'État)
-conseiller (la Ville Manage -Objets)

Le programme doit remplir l'objet Town avec les données d'un fichier donné. Le code ressemble à ça:

COUNTRY.CPP:

Country::Country(string file) { 
    ifstream x(file); 

    Town t; 
    while (x.good()) { 
    x >> t; 
    this->towns.push_back(t); 
    } 
} 

Pour obtenir plus profond -> le « >> t » ressemble à ceci:

TOWN.CPP :

istream& operator>>(std::istream& is, Town& d) { 
    is >> d.state>> d.town; 
    Data a, b; 
    a.SetYear(2011); 
    is >> a >> b; 

    // Some other code was here - but i think it's not relevant 

return is; 
} 

Pour obtenir plus profond -> le « >> un » ressemble à ceci:

DATA.CPP:

istream& operator>>(std::istream& is, Data& d) { 
    return is >> d.total >> d.male >> d.female; 
} 

Comme vous avez vu - les villes sont dans un fichier donné. La structure de la répétition de fichiers maintes et maintes fois (au total: 11292) et ressemble à ceci:

SOURCE (exemple)

Baden-Württemberg 
Kirchheim am Neckar 
5225 
2588 
2637 
5205 
2608 
2597 
Baden-Württemberg 
Kornwestheim 
31053 
15167 
15886 
31539 
15502 
16037 

1ère ligne: Etat
2ème ligne: Ville
3ème-5ème ET 6ème-8ème ligne: les données
REPEAT

soo ... Et pour une raison quelconque le ifstream me donne seulement 16 éléments (16 Tow ns). Hmmm ....

+1

'Kirchheim am Neckar' - L'opérateur' std :: string :: operator >> 'lit uniquement le premier caractère d'espace blanc.C'est peut-être pourquoi vous n'obtenez pas toutes vos données, ou du moins cela semble être une faille dans votre lecture de l'entrée. Tout ce que vous obtenez est «Kirchheim» et non «Kirchheim am Neckar». – PaulMcKenzie

Répondre

2

Lecture d'un std::string en utilisant l'opérateur de décalage lire un seul mot. Par défaut, les mots sont délimités par des espaces. En conséquence, la chaîne Kirchheim am Neckar ne sera pas lue entièrement, mais seulement Kirchheim sera lue. Lorsque vous tentez de lire am sous la forme d'un nombre entier, le flux passe en mode échec et refuse de lire quoi que ce soit tant que ses indicateurs ne sont pas clear().

Vous voulez probablement lire la ville et éventuellement l'état en lisant la ligne entièrement. Utilisez std::getline(stream, str) pour le faire. En outre, toujours tester le succès de votre opération de lecture après la tentative de lecture. La manière idiomatique d'utiliser le flux est

while (x >> t) { 
    ... 
}