C++中的“流stream”是指数据在内存中或内存和外部设备(文件、屏幕等)之间的流动。流分为三种:
- 标准I/O流,内存和标准输入/输出设备之间数据传递
- 文件I/O流,内存和文件之间的数据传递
- 字符串I/O流,内存中的变量和字符串数组之间的信息传递。
C++中,字符串流的继承关系如下:
istream
是输入流,ostream
是输出流,iostream
是输入输出流,stringstream
是基于c++字符串string的输入输出流。此外还有基于c类型char*流,输入流istrstream
,输出流ostrstream
,输入输出流strstream
。
字符串流,最常用的就是把不同类型数据转换为string,例如log日志。下面以string和内置数据类型转换为例,学习一下字符串流。
c++中,如果想把不同类型的数据拼接为string,常常需要格式化字符串。有基于c语言的sprintf/snprintf的格式化、基于字符串流的格式化、基于c++11新的API。
以将int、float和string之间转换为例:
int a = 10;
float b = 12.5;
string c = "10 12.5";
将a b转换为string c,或者将c中字符串数字转换为int和float
基于c语言格式化:
将a b
转换到c
:
char buffer[128];
snprinf(buffer, sizeof(buffer), "%d %f", a ,b);
c = buffer;
snprintf
不做内存管理,需要程序员管理内存,缓存不够时,会截断;它的参数列表是变长参数,编译期间不做参数检查。
将c
转换到a b
:
这时需要找到c
中间的空格,之后调用函数atoi atof
来转换。这两个函数不做错误检查的,程序员需要自己检查错误。
基于c++字符串流的实现:
将a b
转换到c
:
stringstream stream;
strean<<a<<" "<<b;
c = stream.str();
通过c++中的流,可以方便将各种数据类型转换为string,且不需要手动管理内存。
将c
转换到a b
:
stringstream stream;
stream << c;
stream >>a >>b;
相比c语言的实现,c++的实现更加易懂。
基于c++11的实现
c++11有了全局函数to_string
,可以方便将各种内置数据类型转换为string;有了stoi/stol/stoll
等可以将字符串方便转换为数值类型的函数。
将a b
转换到c
:
c += to_string(a);
c += to_string(b);
将c
转换到a b
:
这里还是需要将c
拆分开来,假设已经拆分
a = stoi("10);
b = stof("12.5");
基于c++11的实现转换为字符串是,需要字符串连接;将字符串转换为数值类型时,更加灵活,其实还可以设置是几进制。例如
参考:
cpp stringstream文档
C++11中的string - atoi/itoa
C++ 流(stream)总结