标准C++ I/O库 迭代器让数据自由流动 V8
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;
}
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;
}
数据的流动
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
请按随意键继续. . .
标准C++ I/O库 迭代器让数据自由流动 V8的更多相关文章
- c/c++ 标准库 迭代器(iterator)
c/c++ 标准库 迭代器 begin和end运算符返回的具体类型由对象是否是常量决定,如果对象是常量,begin和end返回const_iterator:如果对象不是常量,返回iteraotor 1 ...
- WebGIS中基于控制点库进行SHP数据坐标转换的一种查询优化策略
文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.前言 目前项目中基于控制点库进行SHP数据的坐标转换,流程大致为:遍 ...
- Libscore – 收集 JavaScript 库的使用数据
Libscore 扫描网络上成千上万的网站,收集统计 JavaScript 库的使用数据.在搜索框中,输入关键词,例如 jQuery, Modernizr, $.ui 或者 $.fn.fancybox ...
- SQL Server跨库复制表数据错误的解决办法
SQL Server跨库复制表数据的解决办法 跨库复制表数据,有很多种方法,最常见的是写程序来批量导入数据了,但是这种方法并不是最优方法,今天就用到了一个很犀利的方法,可以完美在 Sql Serv ...
- 项目中通过Sorlj获取索引库中的数据
在开发项目中通过使用Solr所提供的Solrj(java客户端)获取索引库中的数据,这才是真正对项目起实质性作用的功能,提升平台的检索性能及检索结果的精确性 第一步,引入相关依赖的jar包 第二步,根 ...
- [转]使用 Angular CLI 和 ng-packagr 构建一个标准的 Angular 组件库
使用 Angular CLI 构建 Angular 应用程序是最方便的方式之一. 项目目标 现在,我们一起创建一个简单的组件库. 首先,我们需要创建一个 header 组件.这没什么特别的,当然接下来 ...
- MySQL 实现将一个库表里面的数据实时更新到另一个库表里面
MySQL 实现将一个库表里面的数据实时更新到另一个库表里面 需求描述:MySQL 里面有很多的数据库,这些数据库里面都有同一种表结构的表 (tb_warn_log),这张表的数据是实时更新的,现在需 ...
- 爬虫 Http请求,urllib2获取数据,第三方库requests获取数据,BeautifulSoup处理数据,使用Chrome浏览器开发者工具显示检查网页源代码,json模块的dumps,loads,dump,load方法介绍
爬虫 Http请求,urllib2获取数据,第三方库requests获取数据,BeautifulSoup处理数据,使用Chrome浏览器开发者工具显示检查网页源代码,json模块的dumps,load ...
- 划词标注1——使用svg绘制换行文本并自动识别库中字典数据
业务需求 给出一段文本,自动识别出文本中包含的关键字信息,关键字是库里已知的数据,根据类型的不同显示出不同的颜色 业务分析 1)采用css:文本识别出来后,根据识别出的文本更改对应文本的dom,通过更 ...
随机推荐
- js里给变量拼接双引号
先来看一下最终效果: 但是p标签是要用js生成的.data_attr自定义属性值是一个变量. var data='qq289483936'; var p='<p data_attr='+data ...
- ubuntu 安装mysql及目录位置
安装 sudo apt-get install MySQL-server mysql-client 查看安装端口情况 sudo netstat -tap | grep mysql 配置文件位置 sud ...
- ZOJ 3498 Javabeans
脑筋急转弯. 如果是偶数个,那么第一步可以是$n/2+1$位置开始到$n$都减去$n/2$,后半段就和前半段一样了. 如果是奇数个,那么第一步可以是$(n+1)/2$位置开始到$n$都减去$(n+1) ...
- 第8天-setInterval/setTimeout
setInterval是什么? setInterval()方法重复调用一个函数或执行一个代码段,在每次调用之间具有固定的时间延迟. setInterval(函数,间隔时间) 例如 function f ...
- 【BZOJ 3993】【SDOI 2015】序列统计
http://www.lydsy.com/JudgeOnline/problem.php?id=3992 这道题好难啊. 第一眼谁都能看出来是个dp,设\(f(i,j)\)表示转移到第i位时前i位的乘 ...
- 【hihoCoder 第133周】【hihoCoder 1467】2-SAT·hihoCoder音乐节
http://hihocoder.com/problemset/problem/1467 2-sat模板...详细的题解请看题目里的提示. tarjan模板打错again致命伤qwq #include ...
- 【DFS】【拓扑排序】【动态规划】Gym - 100642A - Babs' Box Boutique
给你10个箱子,有长宽高,每个箱子你可以决定哪个面朝上摆.把它们摞在一起,边必须平行,上面的不能突出来,问你最多摆几个箱子. 3^10枚举箱子用哪个面.然后按长为第一关键字,宽为第二关键字,从大到小排 ...
- 【序列莫队+二分答案+树状数组】POJ2104-K-th Number
[题目大意] 给出一个长度为n的序列和m组查询(i,j,k),输出[i,j]中的第k大数. [思路] 先离散化然后莫队分块.用树状数组来维护当前每个值的个数,然后对于每次询问二分答案即可. 又一次实力 ...
- JVM命令-java服务器故障排查
一.top(Linux命令) 执行top命令: (查看进程15477的详细情况,下文用到) 系统信息(前五行): 第1行:Top 任务队列信息(系统运行状态及平均负载),与uptime命令结果相 ...
- 找出最小元素的下标 Exercise07_10
import java.util.Scanner; /** * @author 冰樱梦 * 时间:2018年下半年 * 题目:找出最小元素的下标 * */ public class Exercise0 ...