59 votes

Comment vérifier si une variable StringStream est vide/nulle ?

J'ai une petite question à vous poser. J'ai cherché en vain jusqu'à présent.

Un peu plus d'informations ici :

stringstream report_string;

report_string << "some string here...";

Dans mon code, il existe plusieurs conditions pour attribuer des valeurs à la variable report_string.

J'aimerais vérifier si une valeur lui a été attribuée ou non.

0 votes

Eh bien, il y a [potentiellement] deux "choses" différentes demandées - qu'avez-vous essayé ?

0 votes

Définissez vos termes. Un exemple de programme dans lequel vous utiliseriez cette capacité serait d'une grande aide (avec un espace réservé où vous faites la "vérification de la nullité").

0 votes

Pouvez-vous préciser ce que vous entendez par "variable is empty/null" ? Voulez-vous dire que vous voulez savoir si le flux ne contient aucune donnée ?

66voto

AusCBloke Points 10179

myStream.rdbuf()->in_avail() peut être utilisé pour obtenir le nombre de caractères disponibles, prêts à être lus, à partir d'un fichier stringstream vous pouvez l'utiliser pour vérifier si votre stringstream est "vide". Je suppose que vous n'essayez pas réellement de vérifier la valeur null .

Par exemple, si vous voulez extraire un int d'un stringstream et voir s'il reste des caractères (c'est-à-dire non numériques), vous pourriez vérifier si myStream.rdbuf()->in_avail() == 0 .

Est-ce que c'est quelque chose de similaire à ce que vous essayez de faire ? Je ne sais pas s'il existe de meilleures méthodes, mais je l'ai déjà fait dans le passé et ça a bien fonctionné pour moi.

https://en.cppreference.com/w/cpp/io/basic_streambuf/in_avail

EDIT : Je vois que vous venez de mettre à jour votre question au moment où j'ai posté.

14voto

SvSharma Points 151

Une vérification facile serait de voir si le contenu de la chaîne du flux est vide ou non :

#include<assert.h>
#include<sstream>

int main(){
std::stringstream report_string;
report_string << ""; // an empty strin g

//emptiness check of stringstream
assert(report_string.str().empty());
}

16 votes

Le problème avec le str() est qu'il crée potentiellement un énorme bloc de mémoire juste pour vérifier s'il est vide ou non.

13voto

oferei Points 401

Cette méthode est efficace et devrait également fonctionner avec les chaînes de sortie :

ostringstream report_string;

if (report_string.tellp() == 0) {
    // do something
}

8 votes

Devrait être if (report_string.tellp() == std::streampos(0)) .

0 votes

J'aime bien celle-ci, bien sûr cela dépend du code qui n'essaie pas de faire un seekp() sur vous. Aussi, je pense que la question de l'OP était de faire quelque chose si tellp() != 0 .

0 votes

@OzSolomon Pouvez-vous s'il vous plaît expliquer pourquoi std::streampos(0) est mieux que simplement 0 ? Je suis sincèrement curieux.

6voto

Liouvetren Points 75

Utilisez eof() à la place.

Code échantillon :

stringstream report_string;
if ( !(report_string.eof()) ) 
    cout << "report_string EMPTY! \n";

1 votes

De ce que je vois, eof() est toujours faux pour std::stringstream . Je n'ai rien vu dans la documentation. Mais c'est ainsi qu'il se comporte même s'il n'est pas vide.

0 votes

Le code dans cette réponse est cassé pour la même raison. while (in.eof()) est souvent cassé : eof() n'est activé que si une tentative d'entrée antérieure a atteint eof() avant de réussir. Ainsi, si disons report_string >> my_int avait lu un nombre à partir de l'entrée et le dernier chiffre était la toute dernière chose dans le flux, eof() serait être true . Mais, si vous avez utilisé char c = report_string.get(); pour obtenir le dernier caractère, il réussirait sans essayer de faire quoi que ce soit à la fin du fichier, et eof() serait pas être vrai. Illustration : aquí

6voto

bdonlan Points 90068

Un moyen serait de vérifier la taille de la chaîne interne et le comparer à zéro. Notez que ceci est différent de myStream.rdbuf()->in_avail() comme le suggère AusCBlock ; in_avail() peut retourner une valeur différente de la taille réelle du flux (si, par exemple, le tampon interne est représenté par plusieurs blocs de mémoire non contigus). En particulier, in_avail() peut, en principe, retourner zéro dans les tampons non vides (il est possible que le stringbuf restreint encore plus cette possibilité ; je n'ai pas vérifié ces détails).

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