How do I check if a StringStream variable is empty/null?
Just a quick question here guys. I've been searching to no avail so far.
A bit more info here:
stringstream report_string;
report_string << "some string here...";
In my code itself are various conditions for assigning values to the report_string variable.
I'd like to check whether it was assigned a value or not.
Solution 1:
myStream.rdbuf()->in_avail()
can be used to get the count of available characters ready to be read in from a stringstream
, you can use that to check if your stringstream
is "empty." I'm assuming you're not actually trying to check for the value null
.
For example if you want to extract an int
from a stringstream
and then see if there were any left over characters (ie. non-numeric) you could check if myStream.rdbuf()->in_avail() == 0
.
Is that something similar to what you're trying to do? I'm not sure if there's better ways but I've done this in the past and it's worked fine for me.
https://en.cppreference.com/w/cpp/io/basic_streambuf/in_avail
EDIT: I see you just updated your question as I posted.
Solution 2:
An easy check would be to see if the string content of the stream is empty or not:
#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());
}
Solution 3:
This method is efficient and should work with output strings as well:
ostringstream report_string;
if (report_string.tellp() == 0) {
// do something
}
Solution 4:
One way would be to check the size of the internal string and compare against zero. Note that this is different from myStream.rdbuf()->in_avail()
as AusCBlock suggests; in_avail() can return a value different from the actual size of the stream (if, for example, the internal buffer is represented with multiple non-contiguous memory blocks). In particular, in_avail()
can, in principle, return zero in non-empty buffers (it's possible that the stringbuf
specification restricts this further; I have no checked in that much detail).
Solution 5:
Use eof() instead.
Sample Code:
stringstream report_string;
if ( !(report_string.eof()) )
cout << "report_string EMPTY! \n";