2010-09-21 44 views
6

我想用stringstream做一个任务的实验,但是我对它的工作原理有些困惑。我做了一个快速搜索,但找不到任何可以回答我的问题的东西。如何读取动态大小的字符串流?

说我有一个动态大小的流,我怎么知道什么时候停止写入变量?

string var = "2 ++ asdf 3 * c"; 
stringstream ss; 

ss << var; 

while(ss){ 
    ss >> var; 
    cout << var << endl; 
} 

和我的输出是:

2 
++ 
asdf 
3 
* 
c 
c 

我不知道为什么我得到,在年底额外的 'C',尤其是因为_M_in_cur = 0x1001000d7 “”

+0

事实上,它是一个stringstream并没有什么改变 - 你可以像读取任何其他流一样读取它。 – 2010-09-21 03:31:18

回答

17

你得到最后额外c,因为您在执行提取后不测试流是否仍然良好:

while (ss)  // test if stream is good 
{ 
    ss >> var; // attempt extraction   <-- the stream state is set here 
    cout << var; // use result of extraction 
} 

您需要测试执行提取操作和使用结果时的流状态。典型地,这是通过在循环条件进行萃取来完成:

while (ss >> var) // attempt extraction then test if stream is good 
{ 
    cout << var; // use result of extraction 
} 
+0

谢谢,我想我的问题应该被视为如何检查流的条件。 – 2010-09-21 07:08:40

+0

@ thomast.sang接受他的回答。 – gsamaras 2016-05-29 00:32:32

-1

还有一个成员函数良好()在此进行测试,如果流可被用于I/O操作。因此,使用这种上面的代码可以变成

while(ss.good()) // check if the stream can be used for io 
{ 
    ss >> var; // attempt extraction   <-- the stream state is set here 
    cout << var; // use result of extraction 
} 
+1

这在一般情况下仍然不正确:如果您尝试提取“int”,并且缓冲区中的下一个可用字符不能被读为“int”,则提取将失败。 – 2010-09-21 14:13:54

0

while(ss)条件检查你的代码检查是否从流最后一次读取的成功与否。但是,即使您已阅读字符串中的最后一个单词,此检查也会返回true。只有在代码中提取ss >> var才会使该条件成为假,因为已到达流的末尾&没有任何东西可以提取到变量var中。这就是你最后得到额外'c'的原因。您可以通过按照James McNellis的建议更改您的代码来消除此问题。

相关问题