2017-06-12 2 views
-2

Je veux vérifier si l'objet ostringstream est vide, c'est-à-dire qu'il ne contient aucune séquence de caractères? J'ai vérifié cpp reference for ostringstream mais ce n'était toujours pas clair pour moi.C++ Comment vérifier si ostringstream est vide

+0

Qu'est-ce qui n'est pas clair sur le message d'erreur? Vous aurez besoin de 'if (oss.str(). Empty())' probablement? Même cette référence merdique dont vous parlez vous dit qu'il n'y a pas de telle fonction. –

+0

Vous pouvez utiliser la méthode 'str()' pour récupérer le contenu et vérifier si elle est vide, ou vous pouvez utiliser son ['peek()'] (http://en.cppreference.com/w/cpp/io/ basic_istream/peek) la méthode – WhiZTiM

+0

en utilisant str() crée une copie du contenu dans le tampon ce qui n'est pas génial pour mon utilisation habituelle http://www.cplusplus.com/reference/sstream/ostringstream/str/ – amey91

Répondre

2

Vous pouvez vérifier sa taille comme vous le feriez pour tout autre std::ostream sous-classe:

std::ofstream ofs; 
std::streampos pos = ofs.tellp(); // store current location 
ofs.seekp(0, ios_base::end);  // go to end 
bool empty = (ofs.tellp() == 0); // check size == 0 ? 
ofs.seekp(pos);     // restore location 

Pour un flux d'entrée (istringstream, ifstream, etc.), alors vous devriez utiliser à la place tellg() et seekg().

Q: Avez-vous besoin de vider le flux avant d'obtenir sa taille? R: En théorie, ce n'est pas le cas, mais la documentation std ne mentionne rien à ce sujet ... Donc le besoin de le faire dépend probablement de l'implémentation.

Sur un std::ostream, je le recommanderais si vous avez récemment inséré des octets et que vous ne les trouvez pas déjà à la fin du flux. Dans la plupart des cas d'utilisation impliquant un flux de sortie, vous serez ajouté au flux et situé à son extrémité distante, il n'est pas nécessaire dans ce cas de stocker et de restaurer l'emplacement du pointeur de recherche.

Vider une std::ostringstream n'est pas une opération coûteuse, dans tous les cas. Sur un flux de fichier de sortie, j'appelle personnellement flush(), car je n'aurais pas la taille du flux au milieu d'une opération de toute façon. Pour résumer, mon conseil personnel est de vider les flux de sortie avant d'obtenir leur taille, à moins que vous soyez sûr que vous êtes à la fin.

Notez que pour std::ifstream, la technique ci-dessus est la seule façon d'obtenir la taille du fichier.

+0

Avez-vous besoin de rincer le flux avant de mesurer? Si non, pourquoi pas? –

+0

@TobySpeight merci pour le bon formatage! –