由上图能够知道,I/O操作的基类是ios_base,各个类的用途例如以下:
<iostream>
istream 从流中读取数据
ostream 向流中写数据
iostream 对流进行读写操作。派生于istream和ostream
<fstream>
ifstream 从文件里读取数据。派生于istream
ofstream 向文件里写数据,派生于ostream
fstream 读写文件, 派生于iostream
<sstream>
istringstream 读取string对象。派生于istream
ostringstream 写string对象。派生于ostream
stringstream 读写string对象,派生于iostream
iostream主要用于读写流的基本类型,fstream主要用于读写文件类型,sstream主要用于读写内存的string对象类型,如下图
IO对象不能拷贝不能赋值;
IO操作的函数形参和返回值类型不能为流类型 ;
进行IO操作的函数常以引用方式传递和返回流,且不能为const;
这里要重点说明的就是sstream中的stringstream,这个实在是太好用了,用于数据类型转换,切割字符串等等是十分的好用。
例子如下:
基本数据类型转换例子 int转string
#include <string>
#include <sstream>
#include <iostream>
int main()
{
std::stringstream stream;
std::string result;
int i = 1000;
stream << i; //将int输入流
stream >> result; //从stream中抽取前面插入的int值
std::cout << result << std::endl; // print the string "1000"
}
除了基本类型的转换,也支持char *的转换。
#include <sstream>
#include <iostream>
int main()
{
std::stringstream stream;
char result[8] ;
stream << 8888; //向stream中插入8888
stream >> result; //抽取stream中的值到result
std::cout << result << std::endl; // 屏幕显示 "8888"
}
再进行多次转换的时候,必须调用stringstream的成员函数clear().
#include <sstream>
#include <iostream>
int main()
{
std::stringstream stream;
int first, second;
stream<< "456"; //插入字符串
stream >> first; //转换成int
std::cout << first << std::endl;
stream.clear(); //在进行多次转换前,必须清除stream
stream << true; //插入bool值
stream >> second; //提取出int
std::cout << second << std::endl;
}
按照空格分割字符串
#include<iostream>
#include<algorithm>
#include<sstream>
#include<string>
using namespace std;
int main()
{
string line;
while(getline(cin,line))
{
int sum=0;
string x;
stringstream ss(line);
while(ss>>x)
cout<<x<<endl;
}
return 0;
}