关键点一: 同一个stringstream对象来多次处理数据,每次使用前,使用stream.str(“”);保证数据已清空。
例如:
1 | std::stringstream ss; |
又或者参看下面这段程序:
1 | #include <cstdlib> |
我们发现运行程序前打开任务管理器,过不了几十秒,所有的内存都将被耗尽!
而把stream.str(“”); 那一行的注释去掉,再运行程序,内存就正常了。
看来stringstream似乎不打算主动释放内存(或许是为了提高效率),但如果你要在程序中用同一个流,反复读写大量的数据,将会造成大量的内存消耗,因些这时候,需要适时地清除一下缓冲 (用 stream.str(“”) )。
另外不要企图用 stream.str().resize(0),或 stream.str().clear() 来清除缓冲,使用它们似乎可以让stringstream的内存消耗不要增长得那么快,但仍然不能达到清除stringstream缓冲的效果(不信做个实验就知道了,内存的消耗还在缓慢的增长!)
关键点二: stringstream处理字符串时,会跳过空白制表符
例如:
1 | #include <cstdlib> |
Result:
1 | hello请按任意键继续. . . |
发现并没有将world输出去。这表明stringstream会跳过空白符。为了避免这种情况,可以使用两种方法:
- 使用getline :
1
2
3
4
5std::stringstream ss;
string result;
ss << "hello world";
getline(ss, result);
cout << result; - 使用.str() :两者都可以正常输出。
1
2
3
4
5std::stringstream ss;
string result;
ss << "hello world";
result = ss.str();
cout << result;
关键点三: stringstream关于std::noskipws及std::ws的使用
std::noskipws :不要跳过空格
std::ws:跳过空格
- std::noskipws
关于上面第二条,有的人建议使用std::noskipws避免跳过空格,即:实际发现并不起作用,因为std::noskipws的作用是当流以空格开头时,会起作用。1
2
3
4
5
6std::stringstream ss;
ss << std::noskipws;
string result;
ss << "hello world";
ss >> result;
cout << result;
即如果改为:将输出空格。注释掉std::noskipws,将会输出1
2
3
4
5
6std::stringstream ss;
ss << std::noskipws;
string result;
ss << " hello world";
ss >> result;
cout << result;1
hello请按任意键继续. .
- std::ws,可以使得using getline时去除前面的空格
请看如下代码:将会输出,注意a前面的空格仍在。以’~’代替空格说明1
2
3
4
5
6std::stringstream ss;
string result;
ss << " a b c" ;
//ss >> std::ws;
getline(ss, result);
cout << result;去掉1
~a b c请按任意键继续. . .
ss >> std::ws;
的注释后,变成:a前面的空格变没了。1
a b c请按任意键继续. . .