如何检查StringStream变量是否为空/ null?

cr8*_*ith 38 c++

这里只是一个简单的问题.到目前为止,我一直在寻找无济于事.

谢谢!

这里有更多信息:

stringstream report_string;

report_string << "some string here...";
Run Code Online (Sandbox Code Playgroud)

在我的代码中,有各种条件为report_string变量赋值.

我想检查它是否被赋值.

Aus*_*oke 47

myStream.rdbuf()->in_avail()可用于获取准备从a读入的可用字符的数量stringstream,您可以使用它来检查您stringstream是否"空".我假设你实际上并没有尝试检查价值null.

例如,如果int要从a中提取a stringstream然后查看是否有任何剩余字符(即非数字),您可以检查是否myStream.rdbuf()->in_avail() == 0.

这与你想做的事情类似吗?我不确定是否有更好的方法,但我在过去做过这个,这对我来说很好.

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

编辑:我看到你刚刚发布时更新了你的问题.


SvS*_*rma 10

一个简单的检查是查看流的字符串内容是否为空:

#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());
}
Run Code Online (Sandbox Code Playgroud)

  • str()的问题在于,它可能会创建一个巨大的内存块,仅用于检查其是否为空。 (3认同)

bdo*_*lan 6

一种方法是检查内部字符串的大小并与零进行比较.请注意,这myStream.rdbuf()->in_avail()与AusCBlock建议的不同; in_avail()可以返回一个与流的实际大小不同的值(例如,如果内部缓冲区用多个非连续的内存块表示).特别是in_avail() 原则上,在非空缓冲区中可以返回零(stringbuf规范可能会进一步限制这一点;我没有检查过那么多细节).


ofe*_*rei 6

此方法非常有效,也应与输出字符串一起使用:

ostringstream report_string;

if (report_string.tellp() == 0) {
    // do something
}
Run Code Online (Sandbox Code Playgroud)

  • 应该是`if (report_string.tellp() == std::streampos(0))`。 (7认同)

小智 5

请改用eof()。

样例代码:

stringstream report_string;
if ( !(report_string.eof()) ) 
    cout << "report_string EMPTY! \n";
Run Code Online (Sandbox Code Playgroud)


Ton*_*roy 5

它通常是合理且可读的...

report_string.str().empty()
Run Code Online (Sandbox Code Playgroud)

...但这可能涉及动态分配并将整个字符串复制到临时字符串,然后被丢弃。

如果性能很重要,另一个选择是......

report_string.peek() == decltype(report_string)::traits_type::eof()
Run Code Online (Sandbox Code Playgroud)
  • 这会查找尚未从流中提取的字符,忽略已成功解析/提取的输入

    • 这与测试不同report_string.str().empty(),测试仍然“看到”已经提取的输入
  • 如果较早的解析使流处于fail您未编辑的状态,则无论是否有更多未提取的字符,clear()都会返回eof()