Par exemple, lors de l'analyse d'un fichier texte, parfois, ce fichier a des choses telles que ceci: Notez que la 3ème ligne a une chaîne vide (rien ni des espaces blancs). La chose est que lorsque vous faites StringStream >> DERNSTRING, et Stringstream a une chaîne vide (null ou juste espace blanc), il ne remplacera pas le "Derstring", cela ne fera rien. There de toute façon pour vérifier cette situation avant la main? Je ne veux pas créer de chaîne vide tempe juste pour vérifier qu'il est toujours vide après Stringstream >>, semble boiteux. P> p>
4 Réponses :
Lorsque vous ne pouvez pas lire à partir du flux - ses changements d'état, donc lors de la coulée à Bool, il renvoie false: ou - dans voir exemple P> p> if-expr code>: < / p>
Ninja! C'est là, je n'attends que le 5 min d'accepter la réponse.
Cela ne compile pas pour moi sur Modern G ++. Beirdly, si je copie et coller exactement le même code dans Ideone, cela ne fonctionne même pas là-bas, malgré l'idéone affirmant qu'il utilise le même compilateur.
@Danielmclyury tu as raison. Maintenant, cet opérateur BOOL code> est explicite. Réponse modifiée.
Vous ne pouvez connaître que après strong> essayer de lire s'il y avait quelque chose ou non. Ce que vous pourrez peut-être faire est de sauter avec espaces et de voir s'il existe un non-espace dans le prochain emplacement: étant donné que les chaînes vides sont bon marché, je ne me dérangerais pas et essayez de lire la chaîne. Notez toutefois que la lecture des flux n'est pas une ligne basée sur la ligne, c'est-à-dire dans votre cas ci-dessus, vous devez d'abord diviser les lignes ou utiliser quelque chose comme std :: getline () code> pour lire la deuxième partie de ligne. p> p>
Depuis le libellé de la question, je pense qu'il a déjà un getline code>, et lit à partir du StringStream. Sinon, la lecture ne «avoir une chaîne vide» et irait à la ligne suivante.
@MOOINGDUCK: Eh bien, comme il s'inquiète de créer une chaîne vide, il semblerait étrange de lire d'abord dans une ligne ;-) Cela dit, j'ai lu la question comme la lecture d'une seule ligne. Sinon, sauter des espaces ne fonctionnerait pas non plus.
Vous pouvez utiliser GetLine, lire une ligne du fichier. Ensuite, copiez la ligne dans un flux de chaîne et lisez les mots du flux de chaîne une à la fois. Les flux vont automatiquement arrêter de lire quand ils manquent de lignes / mots.
// open file std::ifstream fin("text.txt"); // 'iterate' through all the lines in the file unsigned lineCount = 1; std::string line; while (std::getline(fin, line)) { // print the line number for debugging std::cout << "Line " << lineCount << '\n'; // copy line into another stream std::stringstream lineStream(line); // 'iterate' through all the words in the line unsigned wordCount = 1; std::string word; while (lineStream >> word) { // print the words for debugging std::cout << '\t' << wordCount++ << ' ' << word << '\n'; } }
À peu près ce que je fais, ce que je ne savais pas, c'est la vérification de l'opération comme Bool.
Pour vérifier si la chaîne est vide, utilisez Pour vérifier si le flux de chaîne est vide foo.size () == 0 code>. P>
foostream.rdbuf () -> in_avail () == 0 code> p> p>
std :: String Code> a un
vide ( ) code>
fonction membre qui vous dira directement s'il est vide sans avoir à comparer sa taille à une certaine valeur.