C++的字符串读写流
istringstream类用于执行C++风格的字符串流的输入操作。
ostringstream类用于执行C++风格的字符串流的输出操作。
strstream类同时可以支持C++风格的串流的输入输出操作。
1、空格会成为字符串参数的内部分界。
2、要使用上述类,必须包含 sstream 头文件。
注意:由于stringstream构造函数会特别消耗内存,似乎不打算主动释放内存(或许是为了提高效率),但如果你要在程序中用同一个流,反复读写大量的数据,将会造成大量的内存消耗,因些这时候,需要适时地清除一下缓冲 (用 stream.str("") )。
另外不要企图用 stream.str().resize(0),或 stream.str().clear() 来清除缓冲,使用它们似乎可以让stringstream的内存消耗不要增长得那么快,但仍然不能达到清除stringstream缓冲的效果,内存的消耗还在缓慢的增长!
clear()这个名字让很多人想当然地认为它会清除流的内容。实际上,它并不清空任何内容,它只是重置了流的状态标志而已!状态标志位一共有4种, goodbit, eofbit, failbit, badbit。流经过一次<<、>>操作后,此时stringstream会为其设置一个eofbit的标记位,标记其为已经到达eof。查文档得知, 当stringstream设置了eofbit,任何读取eof的操作都会失败,同时,会设置failbit的标记位,标记为失败状态,后面的str()、>>操作都会失败。一般用于多次<<、>>流操作之间。
至于stream.flush(),则根本就起不到任何作用,主要起刷新输出流的作用,比如输出到文件、内存等位置,会清空缓冲区,但是不会改变缓冲区大小。
#include <iostream>
#include <sstream>
#include <string>
#include <stdlib.h>
int main(int argc, char** argv)
{
std::stringstream strStream;
for (int i = 1; i < 100; ++i)
{
strStream.clear();
strStream << i;
std::string numStr;
strStream >> numStr;
std::cout<<numStr<<" ";
}
std::cout<<std::endl;
printf("size=%d\n", strStream.str().capacity());
}
#include <iostream>
#include <sstream>
#include <string>
#include <stdlib.h>
int main(int argc, char** argv)
{
std::stringstream strStream;
for (int i = 1; i < 100; ++i)
{
//strStream.clear();
strStream << i;
std::string numStr;
strStream >> numStr;
std::cout<<numStr<<" ";
}
std::cout<<std::endl;
printf("size=%d\n", strStream.str().capacity());
}
这里的15是默认缓冲区大小。
有关resize和reserve
resize():改变当前容器内含有元素的数量(size()),eg: vector<int>v; v.resize(len);v的size变为len,如果原来v的size小于len,那么容器新增(len-size)个元素,元素的值为默认为0.当v.push_back(3);之后,则是3是放在了v的末尾,即下标为len,此时容器是size为len+1;
reserve():改变当前容器的最大容量(capacity),它不会生成元素,只是确定这个容器允许放入多少对象,如果reserve(len)的值大于当前的capacity(),那么会重新分配一块能存len个对象的空间,然后把之前v.size()个对象通过copy construtor复制过来,销毁之前的内存;
只有当容器内元素数(size)大于capcity时,容器才会改变地址。
vector<int> v;
当v.resize(len)中len>v.capacity(),则v中的size和capacity均设置为len;
当v.resize(len) 中len<=v.capacity(),则v中的size设置为len,而capacity不变; 如果此时len<v.size(),那么多出的那些对象(v[len], v[len+1]…)会被销毁,v[0]-v[len-1]仍保留在原地。
当v.reserve(len)中len>v.capacity(),则v中的capacity变为len,size不变,size只跟容器中元素数和resize有关(v.resize(len)将原来不存在的元素设为初值0)。
当v.reserve(len)中len<=v.capacity(),则v中的capacity不变,size不变,即不对容器做任何改变。
总结:size可能改变capacity,但capacity不会改变size;