C++中的字符串流

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/KangRoger/article/details/72758426

C++中的“流stream”是指数据在内存中或内存和外部设备(文件、屏幕等)之间的流动。流分为三种:

  • 标准I/O流,内存和标准输入/输出设备之间数据传递
  • 文件I/O流,内存和文件之间的数据传递
  • 字符串I/O流,内存中的变量和字符串数组之间的信息传递。

C++中,字符串流的继承关系如下:
blog_005.jpg

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)总结

猜你喜欢

转载自blog.csdn.net/KangRoger/article/details/72758426