注:以下概念大部分来自《c++ primer 中文版》(第四版)
- 流迭代器主要分为两种:istream_iterator和ostream_iterator。
- 前者用于读取输入流,后者用于写输出流。前者用于读取输入流,后者用于写输出流。这些迭代器将他们所对应的流视为特定类型的元素序列。
- 流迭代器只定义了最基本的迭代器操作:自增、解引用和赋值。
- 流迭代器只定义了最基本的迭代器操作:自增、解引用和赋值。
- 流迭代器只定义了最基本的迭代器操作:自增、解引用和赋值。流迭代器只定义了最基本的迭代器操作:自增、解引用和赋值。
- 两个istream可以比较迭代器是否相等(或不等)。而ostream迭代器则不提供比较运算。两个istream可以比较迭代器是否相等(或不等)。而ostream迭代器则不提供比较运算。
- 流迭代器都是类模板:任何已定义输入操作符(>>操作符) 的类型都可以定义istream_iterator。类似的,任何已定义输出操作符(<<操作符号)的类型也可以定义ostream_iterator。
- ostream_iterator 不提供超出末端迭代器。
istream_iterator 操作
将文件打开,将里面的内容放入一个vector中
#include <iostream>
#include <iterator>
#include <list>
#include <vector>
#include <algorithm>
#include <istream>
#include <fstream>
using namespace std;
ifstream& get_file(ifstream& in, const string file_path){
in.close();
in.clear();
in.open(file_path);
return in;
}
int main() {
string file_path = "/home/****/CLionProjects/learn_C_point/if_test";
ifstream file;
get_file(file, file_path);
if (!file) {
cerr << "file open failed" << endl;
return 0;
}
string term;
istream_iterator<string> in_iter(file);
istream_iterator<string> eof;
vector<string> vi;
while (in_iter != eof) {
vi.push_back(*in_iter++);
}
cout << "输出在vector里面的元素" << endl;
for (auto x: vi)
cout << x << " ";
cout << endl;
get_file(file, file_path);
if (!file) {
cerr << "file open failed" << endl;
return 0;
}
istream_iterator<string> in_iter2(file);
vector<string> vi2(in_iter2, eof);
cout << "输出第二个vector里面的元素" << endl;
for (auto x: vi2)
cout << x << " ";
return 0;
}
输出在vector里面的元素
hello world nihao haode
输出第二个vector里面的元素
hello world nihao haode
ostream_iterator操作
- ostream_iterator 对象必须与特定的流绑定在一起
- ostream_iterator 不提供末端迭代器
#include <iostream>
#include <iterator>
#include <list>
#include <vector>
#include <algorithm>
#include <istream>
#include <fstream>
using namespace std;
ofstream& get_file(ofstream& out, const string file_path){
out.close();
out.clear();
out.open(file_path, fstream::app);
return out;
}
int main() {
string file_path = "/home/baobao/CLionProjects/learn_C_point/of_test";
ofstream file;
get_file(file, file_path);
if (!file)
cerr << "file open failed" << endl;
vector<string> vs;
vs.push_back("hello");
vs.push_back("world");
vs.push_back("nihao");
vs.push_back("haode");
ostream_iterator<string> out_iter(file, "\n");
for (auto item = vs.begin(); item != vs.end(); item++)
*out_iter++ = *item;
return 0;
}