使用Xstream_iterator进行文件复制

文件复制,通常的办法都是从一个文件中读取一定字节数,循环写入目的文件,直到文件结尾。使用c/c++/java/python各种语言都很容易实现。同时java中,还有channel,jdk7中的Files.copy()等强大的函数实现。

eg:(c++)

 1#include"bits/stdc++.h"2   using namespace std;3   int main()4 {  5    const int size = 100;6    ifstream fin("./SourceFile.txt");7    ofstream fout("./DestFile.txt");8    char buff[size];9    if (fin.is_open()) {
10           while (!fin.eof()) {
11               fin.read(buff,size);
12               fout.write(buff, fin.gcount());
13           }
14           fin.close();
15           fout.close();
16     }
17    return 0;
18 }
19

解释:

   fin.read()和fout.write()的读写函数既适用于文本文件又适用于二进制文件,fin.gcount()返回实际读取字节数。

下面我要讲的是基于读写迭代器和std::copy()的方法。

首先是std::copy()函数,遇见这个函数是因为看到使用容器迭代器将一个容器中的元素复制到另一个容器。比如:std::copy(vi.begin(),vi.end(),li.begin());然后发现它还可以使用于内置数组,于是,我借助于vs2017查看了它的源代码:

 1template<class _InIt,class _OutIt>2    inline _OutIt copy(_InIt _First, _InIt _Last, _OutIt _Dest)3   {  // copy [_First, _Last) to [_Dest, ...)4 _Adl_verify_range(_First, _Last); 5 const auto _UFirst = _Get_unwrapped(_First);6 const auto _ULast = _Get_unwrapped(_Last);7 const auto _UDest = _Get_unwrapped_n(_Dest, _Idl_distance<_InIt>(_UFirst, _ULast)); 8 _Seek_wrapped(_Dest, _Copy_unchecked(_UFirst, _ULast, _UDest));9 return (_Dest);
10 }

解释:

   std::copy()是使用模板函数实现的,参数_InIt指输入迭代器,_OutIt指输出迭代器,所以就不难理解了,将两个输入迭代器范围[_First,_Last) 复制到输出迭代器_Dest。

然后在学习过程中,我深入了解了迭代器分类:输入迭代器,输出迭代器,前向迭代器,双向迭代器,随机访问迭代器。又学习到istream_iterator和ostream_iterator刚好就是典型的输入、输出迭代器。那么,我想能不能用迭代器实现控制台输出输入呢?下面就是试出来的代码:

 1#include"bits/stdc++.h"2   using namespace std;3   int main()4 {  5    int  va;6    istream_iterator<int> in(std::cin), eis;//查看源代码创建in的时候已经等待输入了,不带参的构造对象表示结束符7    if(in!=eis)va = *in;8    ostream_iterator<int> out(std::cout,"\n");//查看源代码创建out,还可以指定输出间隔符号9    *out = va;
10    return 0;
11 }
12

这样就实现了用输入输出迭代器进行标准输入输出。

然后,大家就能想到啦!既然标准输入输出能够成功,那么继承于iostream的fstream就是文件的输入输出,那它也应该能行啊,同时结合std::copy()可以接受输入输出迭代器参数,就能实现文件输入输出的复制行为了。

 1#include"bits/stdc++.h"2   using namespace std;3   int main()4 {  5    ifstream fin("./SourceFile.txt");6    istream_iterator<string> ifs(fin),eis;7    ofstream fout("./DestFile.txt");8    ostream_iterator<string> ofs(fout,"\n");9    std::copy(ifs, eis, ofs);
10    fin.close();
11    fout.close();
12    return 0;
13 }
14

这样能实现文本文件的复制。但是有一个问题是istream_iterator类型中,是对string操作。读取文件为string类型时,会将换行符丢弃,所以如果文本内容中存在多个空行都会变成一个换行。

后记:

既然是Xstream_iterator,说明可以对所有流类型进行迭代操作,所以当然可以对stringstream进行操作。同时其他所有迭代器都是继承于输入输出迭代器,所有std::copy()可以对所有五种迭代器类型操作。
ps:欢迎关注:

  • The End -

使用Xstream_iterator进行文件复制相关推荐

  1. Java学习总结:44(文件复制案例)

    案例:文件复制(针对InputStream和OutputStream的操作应用) 流程图(比较复杂我就不敲了,直接拍出来) 例:实现文件复制操作 package Project.Study.FileC ...

  2. Linux中的文件复制:cp和scp

    在使用操作系统的使用过程中,常常需要复制文件到本地或者传输文件到其他电脑上,这时候用到两个命令cp和scp. cp命令用来复制文件或者目录.scp是secure copy的简写,用来在Linux下进行 ...

  3. 基于Guava实现的文件复制

    需求:现需要将文件D:\A\B\C\abc.txt进行一下操作 1.在文件夹D:\A\B\C下,没有以abc命名的文件夹则创建 2.将目标文件D:\A\B\C\abc.txt复制到abc下 实现代码: ...

  4. c语言实现将两个文件复制到一个文件里_Python中复制文件的9种方法

    作者:小小程序员 链接:https://zhuanlan.zhihu.com/p/91277888 来源:知乎 著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. Python 中有 ...

  5. cp -r dir1/. dir2 表示将dir1下的文件复制到dir2,不包括dir1目录

    cp -r dir1/. dir2 表示将dir1下的文件复制到dir2,不包括dir1目录 https://baijiahao.baidu.com/s?id=1640827749992218805& ...

  6. 使用组策略实现文件复制

    使用组策略实现文件复制 组策略包括文件首选项扩展.对于计算机或用户,使用此扩展可以: u 将文件(或一个文件夹中的多个文件)复制到新位置,然后配置这些文件的属性.会根据需要创建新的子文件夹. u 删除 ...

  7. 拖放操作和文件复制小功能

    一直都没试过拖放操作的用处,今天试了试,发现真的很好用!! 下面的代码没有打入注释,加入了一个ListBox,当文件拖放上来后,讲内容显示在里面  private void lstFilePath_D ...

  8. java io 文件复制_实例讲述Java IO文件复制

    前言:IO流主要分为两大类,分别是字节流与字符流 注意: 1.音频文件.图片.视频(范围广),就用字节流 2.只涉及到文本的,就用字符流 使用字节流复制文本内容(其他文件也可以) 代码如下: impo ...

  9. Java实现文件复制的四种方式

    背景:有很多的Java初学者对于文件复制的操作总是搞不懂,下面我将用4中方式实现指定文件的复制. 实现方式一:使用FileInputStream/FileOutputStream字节流进行文件的复制操 ...

最新文章

  1. hdu 1520 没有上司的晚会
  2. oracle 12C(12.2.0.1)安装-plm系统(一)
  3. spring配置连接mysqlxml
  4. 在查询语句中使用 NOLOCK 和 READPAST
  5. SAP CRM中的文本类型 - Text Type
  6. jzoj1371-假期【RMQ】
  7. element中select默认选中第一个_探索在网页中使用“标注”
  8. Android开发学习——画横线竖线
  9. MTK驱动(84)---GPS 配置
  10. 山东建筑大学校内购物网(SdaiBuy.com )V1.2 Beta
  11. struts启动过滤器异常_SpringCloud Gateway高阶之全局异常处理
  12. [Javascript]js中所学知识点回顾总结
  13. python julia go_Python的四个挑战者:Swift、Go、Julia、R
  14. 在kali Linux2021中安装搜狗输入法(详细教程)
  15. 无法听到计算机发出的声音怎么办,为什么视频对方听不到我说话_电脑视频对方听不到声音的解决方法...
  16. linux ssh服务状态,查看linux ssh服务信息及运行状态方法
  17. 【华为机考刷题】2022_6_14
  18. 微软的黑屏说明了什么?
  19. 关于华三WLAN调试空口利用率居高不下的调试心得
  20. java 电子秤串口通信_电子秤重量读取(串口通讯)

热门文章

  1. 互联网创业的南派与北派
  2. “用与不用 天壤之别”:图说HDS双活GAD
  3. P1022 计算器的改良 (模拟)
  4. 如何选择kmeans中的k值——肘部法则–Elbow Method和轮廓系数–Silhouette Coefficient...
  5. android recyclerview item点击事件,RecyclerView的Item的单击事件
  6. oracle TRUNC()
  7. 分享30个免费主机的网站
  8. 手把手教你SW如何装配链条
  9. 织梦去除版权中的Power by DedeCms
  10. piakchu靶场 :一、暴力破解