7
votes

Comment vérifier si StringStream >> String ne mettra rien sur la chaîne?

Par exemple, lors de l'analyse d'un fichier texte, parfois, ce fichier a des choses telles que ceci: xxx

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.


0 commentaires

4 Réponses :


22
votes

Lorsque vous ne pouvez pas lire à partir du flux - ses changements d'état, donc lors de la coulée à Bool, il renvoie false: xxx

ou - dans if-expr : < / p> xxx

voir exemple


3 commentaires

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 est explicite. Réponse modifiée.



2
votes

Vous ne pouvez connaître que après 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: xxx

é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 () pour lire la deuxième partie de ligne.


2 commentaires

Depuis le libellé de la question, je pense qu'il a déjà un getline , 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.



0
votes

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


1 commentaires

À peu près ce que je fais, ce que je ne savais pas, c'est la vérification de l'opération comme Bool.



0
votes

Pour vérifier si la chaîne est vide, utilisez foo.size () == 0 .

Pour vérifier si le flux de chaîne est vide foostream.rdbuf () -> in_avail () == 0


1 commentaires

std :: String a un vide ( ) fonction membre qui vous dira directement s'il est vide sans avoir à comparer sa taille à une certaine valeur.