CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C++ 语言

如何用fstream实现文件的逐块拷贝?

楼主ufouser(ufouser)2005-06-01 20:29:05 在 C/C++ / C++ 语言 提问

ifstream   fin("src.txt");  
  ofstream   fout("tgt.txt");  
   
  char   buf[4096];  
   
  while   (fin.read(buf,   4096))  
  {  
  fout.write(buf,   4096);  
  }  
   
  fin.close();  
  fout.close();  
   
  这个程序肯定不行  
  那么如何知道fin.read()实际读了多少字节呢? 问题点数:0、回复次数:8Top

1 楼6spring(6Spring)回复于 2005-06-01 20:38:40 得分 0

说个简单思路  
   
  获得文件size,然后读取filesize/bufsize次,最后一次读剩余部分(filesize%bufsize)Top

2 楼ufouser(ufouser)回复于 2005-06-01 20:48:19 得分 0

这个我也会  
   
  我就是想求一下能不能知道read实际上读了多少字节Top

3 楼mostideal(三甲)回复于 2005-06-02 00:25:35 得分 0

dingTop

4 楼ufouser(ufouser)回复于 2005-06-02 00:32:37 得分 0

按照   6spring(6Spring)   的提示写了个简单程序,   结果又引起了另外一个问题  
   
  /*    
  in.txt在windows中显示的大小是13字节,    
  但逐个读取(用fin.get())时只能读到11字节  
  这个11和13分别是怎么来的?  
  怎么才能在程序中得到11而不是13呢?  
   
  in.txt内容如下(最后的i的后面没有换行)  
  abc  
  def  
  ghi  
   
  */  
   
  ifstream   fin("in.txt");  
  ofstream   fout("out.txt");  
   
  const   int   N   =   256; //   缓冲区大小  
  char   buf[N]; //   缓冲区  
   
   
  fin.seekg(0,   ios::end); //   读指针移到文件尾  
  int   nFileSize   =   fin.tellg(); //   取文件大小,   =   13  
   
  int   nRemain   =   nFileSize; //   记录还剩余多少字节没读  
  fin.seekg(0,   ios::beg); //   读指针移到文件头  
   
  //   开始成块读取并发送  
  while   (nRemain   >   0)  
  {  
  int   nCount   =   0; //   保存当前块的大小  
  if   (nRemain   <   N)   { //   未处理字节数不足N  
  nCount   =   nRemain;  
  nRemain   =   0;  
  }  
  else   { //   未处理字节数大于等于N  
  nCount   =   N;  
  nRemain   -=   N;  
  }  
  fin.read(buf,   nCount); //   读入  
  fout.write(buf,   nCount);//   写出  
  }  
   
  fin.close();  
  fout.close();  
   
  /*  
  结果out.txt如下  
   
  abc  
  def  
  ghi烫  
   
  */  
   
  即out.txt   比in.txt多了两个字节  
  用这个方法处理其他格式的文件(我用.mp3试的)时也是如此,   拷贝后文件大于原来的文件  
   
  如何处理这个问题呢?   或者说最关键的,   如何得到文件的"能让我们读的真实大小"(比如上面的11而不是13)Top

5 楼ufouser(ufouser)回复于 2005-06-02 00:48:11 得分 0

我晕,   忘了加ios::binary了  
  Top

6 楼zdy_8212(zdy_8212)回复于 2005-06-02 03:02:12 得分 0

那不就得析出控制符了吗?Top

7 楼someone(阿风)回复于 2005-07-27 16:10:16 得分 0

fin.read()之后用fin.gcount()就可知道读出的有效数据是多少。Top

8 楼someone(阿风)回复于 2005-07-27 16:14:22 得分 0

ifstream   fin("src.txt");  
  ofstream   fout("tgt.txt");  
   
  char   buf[4096];  
   
  while   (fin.read(buf,   4096))  
  {  
          fout.write(buf,   fin.gcount());  
  }  
   
  fin.close();  
  fout.close();Top

相关问题

  • 拷贝文件
  • 文件拷贝
  • 文件夹拷贝
  • ftp拷贝文件
  • 文件拷贝的问题
  • 拷贝文件的问题
  • 如何拷贝文件?
  • 用api拷贝文件
  • 如何拷贝文件?
  • 怎样拷贝文件?(急)

关键词

  • 文件
  • fin
  • nremain
  • fout
  • 大小
  • 程序
  • txt
  • buf
  • read

得分解答快速导航

  • 帖主:ufouser

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo