2014-07-25 1 views
0

j'ai fichier .txt avec du texte comme celui-ci à l'intérieur (ce qui est juste un fragment):lecture de données multiples de chaîne, séparés par des caractères à l'aide sstream

... 
[332, 605]-[332, 592], srednica: 13 
[324, 593]-[332, 605], srednica: 14.4222 
[323, 594]-[332, 605], srednica: 14.2127 
[323, 594]-[331, 606], srednica: 14.4222 
[324, 593]-[324, 607], srednica: 14 
[323, 594]-[323, 607], srednica: 13 
[319, 596]-[319, 607], srednica: 11 
[320, 595]-[320, 607], srednica: 12 
... 

Ce que je dois à est d'obtenir un 4 premiers chiffres de chaque ligne et les stocker en entiers.

J'ai essayé smth comme ceci:

ifstream file("punkty_srednice.txt"); 
string line; 
int ax, ay, bx, by; 
while(getline(file, line)) { 
    stringstream s(line); 
    string tmp; 
    s >> tmp >> ax >> tmp >> ay >> tmp >> bx >> tmp >> by >> tmp; 
    cout << ax << " " << ay << " " << bx << " " << by << endl; 
} 

sortie (juste une partie de celui-ci):

... 
506 506 -858993460 -858993460 
503 503 -858993460 -858993460 
495 503 -858993460 -858993460 
497 503 -858993460 -858993460 
500 497 -858993460 -858993460 
492 503 -858993460 -858993460 
... 

Comme u un voir il y a quelques numéros étranges comme -858993460

I fait d'autres essayer en supprimant tmp et aller tout droit comme ça:

s >> ax >> ay >> bx >> by; 

mais la sortie ne contient que des numéros de déchets comme -858993460

Comment puis-je faire face?

Répondre

1

Vous pouvez utiliser std::getline avec le ',' comme séparateur pour obtenir les premières parties, avec les nombres. Remplacez ensuite tous les caractères non numériques par un espace (voir par exemple std::transform). Ensuite, placez la chaîne résultante dans un std::istringstream et lisez-en quatre nombres.


Quelques conseils sur ce qui ne va pas avec votre code, cela se réduit essentiellement à que lorsqu'il est utilisé avec des chaînes, l'opérateur d'entrée >> lit l'espace délimité cordes.

Donc, pour la ligne

 
[332, 605]-[332, 592], srednica: 13 

votre entrée sera

  1. en tmp il sera mis "[332,"
  2. en ax il mettra le 605
  3. en tmp il sera mis "]-[332,"
  4. en ay il mettra 592
  5. en tmp il mettra "],"
  6. en bx il essayer de lire la chaîne "srednica" qui n'est pas un numéro valide, et l'entrée échouera et mettre le drapeau fail sur le flux d'entrée, ce qui toutes les entrées suivantes invalides

Comment remplacer un caractère non numérique dans une chaîne à un espace en utilisant std::transform:

std::string s = "[332, 605]-[332, 592]"; 
std::cout << "Before: \"" << s << "\"\n"; 

std::transform(std::begin(s), std::end(s), std::begin(s), 
    [](const char& ch) -> char 
    { 
     return (std::isdigit(ch) ? ch : ' '); 
    }); 

std::cout << "After : \"" << s << "\"\n"; 

Le code imprime ci-dessus

 
Before: "[332, 605]-[332, 592]" 
After : " 332 605 332 592 " 
+0

Vous êtes complètement à droite! Maintenant, j'ai réalisé pourquoi je reçois 2 bonnes valeurs et 2 poubelles. Je ne peux pas trouver un bon exemple de STD :: Transformer donc j'ai remplacé étape par étape ''[' ']' '-' ','' – ilovkatie

+0

@ user3804906 Suivez les liens dans ma réponse. :) –

Questions connexes