IO库的组成
三种流
C++的IO库以流对象为实体,主要有三种流:
(1)标准输入输出流
(2)文件输入输出流
(3)字符串输入输出流
流迭代器
输入输出流迭代器
instream_iterator<type>
ostream_iterator<type>
从控制台到容器
istream_iterator<T> first(cin);
istream_iterator<T> last;
copy(first,last,back_inserter(v));//调用容器的push_back方法
vector<string> vs(first,last);
从容器到控制台
ostream_iterator<T> first(cout," ");
copy(v.begin(),v.end(),first);
从文件到容器
ifstream fin("inputfile.txt");
istream_iterator<T> first(fin),last;
vector<T> v(first,last);
从文件到string
ifstream fin("inputfile.txt");
//下面再读取字符的时候文件中的空白字符也会放到string中
istreambuf_iterator<char> first(fin),last;//注意与上面一段的区别
string v(first,last);
//如果使用istream_iterator<char> first(fin),last;则会从文件中用
//>>操作符读取char变量放到string中,空白符丢失
从容器到文件
ofstream fout("outputfile.txt");
ostream_iterator<T> first(fout," ");//注意这里不需要last
copy(v.begin(),v.end(),first);
流对象的状态
s.eof() //流结束状态,输入流中已经读完所有数据,再读一次就会是eof为true
s.fail() //变量转换失败clear(ios::failbit)
s.bad() //
s.clear() //所有状态重置为有效
容器都有自己的迭代器
容器
vector
string
deque
list
v.begin() v.end()
l.cbegin() l.cend()
流的迭代器
流迭代器用来写入流,或者从读流对象读数据,输入流迭代器使用strm>>t操作,将数据写到变量中,你看看>>操作符像不像箭头,这个箭头代表了数据的流向,C++作者说的,呵呵。同样输出流使用<<操作符,将变量的数据写到流中。
输入流迭代器 输出流迭代器
istream_iterator<T> iter_begin(strm),iter_end; ostream_iterator<T> iter_begin(strm),iter_end;/
以变量为单位,空白符将会被吃掉 以变量为单位,空白符将会被吃掉
istreambuf_iterator<char> iter_begin(strm),iter_end; ostreambuf_iterator<char> iter_begin(strm),iter_end;
以字符为单位,空白符将会按照一个单位处理 以字符为单位,空白符将会按照一个单位处理
字符流迭代器示例
#include <iostream>
#include <string>
#include <sstream>
#include <iterator>
#include <algorithm>
using namespace std;
int main(int , char**)
{
std::string str("a b c 123 !");
cout<<str<<endl;
stringstream ss(str);
istreambuf_iterator<char> itrBegin(ss),itrEnd;
copy(itrBegin, itrEnd, ostream_iterator<char>(cout));
return 0;
}
C++打印main.cpp源代码
#include <iostream>
#include <fstream>
#include <algorithm>
#include <iterator>
using namespace std;
int main(int argv, char** argc)
{
ifstream fin("main.cpp");
//buf迭代器会得到空白字符
istreambuf_iterator<char> itrFile(fin), endFile;
//输出迭代器仅仅迭代一个char即可,不需要是buf迭代器
ostream_iterator<char> itrCout(cout);
copy(itrFile, endFile, itrCout);
return 0;
}
![](https://i-blog.csdnimg.cn/blog_migrate/fe65c3140ca5e16a41255f1a1be4469a.png)
C++打印main.cpp源代码
(先放到字符串中,再打印字符串)
#include <iostream>
#include <fstream>
#include <algorithm>
#include <iterator>
using namespace std;
int main(int argv, char** argc)
{
ifstream fin("main.cpp");
string str;
istreambuf_iterator<char> itrFileBegin(fin), itrFileEnd;
copy(itrFileBegin, itrFileEnd, back_inserter(str));//把源文件内的代码(包括字符和空格)放到字符串中
//只有遇到'\0'才会结束,而源文件中的空格字符(' '对应的数值为32)
//,回车字符,Tab字符对应的值都不是'\0',所以都能被打印出来
cout<<str.c_str()<<endl;
return 0;
}
![](https://i-blog.csdnimg.cn/blog_migrate/e7b58941b2762f15d43a8d8c44e33e3e.png)
数据的流动
copy(iter_from_begin,iter_from_end,iter_dest_begin);
<iterator> <iterator>
inserter(strm) //v.insert istream_iterator<T> iter_begin(strm),iter_end;
back_inserter(strm) //v.push_back istreambuf_iterator<char> iter_begin(strm),iter_end;
front_inserter(strm) //v.push_front
<------------------------------------------------------ 数据 < ---------------------------------------------------
容器 流对象
vector fstream
string sstream
list deque cin cout
----------------------------------------------------------> 数据 ---------------------------------------------------->
v.begin() v.end() ostream_iterator<T> iter_begin(strm),iter_end;/
l.cbegin() l.cend() ostreambuf_iterator<char> iter_begin(strm),iter_end;
copy(iter_from_begin,iter_from_end,iter_dest_begin);
示例:
#include <iostream>
#include <sstream>
#include <string>
#include <vector>
#include <algorithm>
#include <iterator>
using namespace std;
int main(int argc, char *argv[])
{
int temp_int[5] = {1,2,3,4,5};
vector<int> vector_int;
//array to vector
copy(temp_int,temp_int+sizeof(temp_int)/sizeof(int),back_inserter(vector_int));
//vector to cout
copy(vector_int.begin(),vector_int.end(),ostream_iterator<int>(cout," "));
cout<<endl;
//vector to stringstream
stringstream strm;
copy(vector_int.begin(),vector_int.end(),ostream_iterator<int>(strm," "));
cout<<strm.str()<<endl;
//stringstream to vector<string>
vector<string> vector_string;
copy(istream_iterator<string>(strm),istream_iterator<string>(),back_inserter(vector_string));
copy(vector_string.begin(),vector_string.end(),ostream_iterator<string>(cout," "));
cout<<endl;
return 0;
}
输出如下:
1 2 3 4 5
1 2 3 4 5
1 2 3 4 5
请按任意键继续. . .