标准I/O库类继承体系
对应关系:
- istream,ifstream,istringstream
- ostream,ofstream,ostringstream
- iostream,fstream,stringstream
从上图我们可以看到,stringstream
兼具istringstream
(从字符串流中读数据)ostringstream
(向字符串流中写数据)的功能(它们三者的头文件均位于<sstream>),既然如此我们是不是在任何istringstream
和ostringstream
出现的地方替换为stringstream
(任何istream
和ostream
出现的地方替换为iostream
,三者的头文件均位于<iostream)呢。然而事实上并没有这么做。
既从一个字符串中读又从中写数据是一件古怪(且很少发生)的行为1。
std::stringstream ss;
ss << "hello world ";
// world 后要有至少有一个空格,
ss << 42;
std::string str1, str2; int i;
// 流以空格为分割,且忽略冗余空格
ss >> str1 >> str2 >> i;
std::cout << str1 << str2 << str3 << std::endl;
流的好处
流的好处在于无论何种基本数据类型都可丢到流中,且很方便再重新取出赋值,这是字符串类型所做不到的。
#include <stdlib.h>
// _itoa
// 进行windows平台下的编译器
std::stringstream ss;
ss << "hello world " << 42;
std::string str1, str2; int i;
ss >> str1 >> str2 >> i;
std::string s;
int i = 42;
s += "hello world ";
char arr[5];
_itoa(i, arr, 10);
s += arr;
// 较为啰嗦和复杂
good()
判断文件打开是否成功:
std::ofstream ofs("./1.txt");
assert(ofs.good());
// 文件打开成功时,good()返回值为true
// 否则为false
返回值类型
C++ 中的 string 类型定义:
typedef basic_string<char, char_traits<char>, allocator<char> >
string;
对 string 类型的 s 而言,s.c_str():string ==》 char*
对流类型的 s 而言,s.str():stream ==》 string