C++ 读写大文件代码
来源:互联网 发布:qq音速网络连接 编辑:程序博客网 时间:2024/06/10 02:53
可读写大于4G的文件,测试文件为vs2013安装包,大小为7.08G。程序为64bit。
#include "stdafx.h"#include <windows.h>#include <memory.h>#include <iosteam>#include <fstream>using namespace std;const char FILE_RD = "d:\\vs2013.iso";//原文件const char FILE_WR = "d:\\vs2013_bak.iso";//待写入的文件const size_t WR_SIZE = 1024*1024*10;//每次读写的大小,此处为10Mvoid hugefile_rw(){ FILE* stream_rd,*stream_wr; size_t num_read,num_written; int rw_cnt = 0; long long offset = 0; if(0 != fopen_s(&stream_wr,FILE_WR,"wb")){//获取待写入文件的句柄 return; } DWORD dStart = GetTiclCount(); char *buf = new char[WR_SIZE]; if(0 == fopen_s(&stream_rd,FILE_RD,"rb")){ while(!feof(stream_rd)){ rw_cnt++; //读 num_read = fread(buf,sizeof(char),WR_SIZE,stream_rd); if(0==num_read) break; offset += num_read;//文件偏移 _fseeki64(stream_rd,offset,SEEK_SET); //写 num_written = fwrite(buf,sizeof(char),num_read,stream_wr); _fseeki64(stream_wr,offset,SEEK_SET); cout<<"Cnt = "<<rw_cnt<<",num_read = "<<num_read <<",num_written = "<< num_written; } } DWORD dEnd = GetTiclCount(); cout<<"读写时间 = "<< (dEnd - dStart)/1000<<"s"<<endl; //资源释放 delete []buf; fclose(stream_rd); fclose(stream_wr); }int main(int argc,_TCHAR* argv[]){ hugefile_rw(); getchar(); return 0;}//if(0 == ferror(stream_wr)){ //ok//}
用fread读“.dat”文件时不能读完整个文件,只要是读到0x1A时,fread就认为结束!用text模式打开文件时,系统默认CTRL+Z为文件结束符,而0x1A刚好就是CTRL+Z的ASCII码。以以下格式打开文件。
datafile = fopen(“whatever.dat”, “rb”); 这样就可以解决以上问题!
测试可行,但是速度不是很好,可以考虑多线程或者内存映射文件方式以提高效率。
每次读写1G效率低,100M好些,10M更好些,1M,512k 速度差不多,可能是局部性原理,缓存的原因。
也可以用fstream的方式,代码如下:
#include "stdafx.h"#include <windows.h>#include <memory.h>#include <iosteam>#include <fstream>using namespace std;const char FILE_RD = "d:\\vs2013.iso";//原文件const char FILE_WR = "d:\\vs2013_bak.iso";//待写入的文件const size_t WR_SIZE = 1024*1024*10;//每次读写的大小,此处为10Mvoid hugefile_rw2(){ DWORD dStart = GetTiclCount(); fstream in(FILE_RD,ios::in | ios::binary); fstream out(FILE_WR,ios::out | ios::binary); // ifstream in(FILE_RD,ios::in | ios::binary); // ofstream out(FILE_WR,ios::out | ios::binary); DeleteFileA(FILE_WR); char *buf = new char[RD_SIZE]; while(!in.eof()){ std::streamsize num_read = in.read(rd_buf,RD_SIZE).gcount(); if(0==size) break; in.seekg(size,ios::cur); out.write(rd_buf,size); out.seekg(size,ios::cur); } DWORD dEnd = GetTiclCount(); cout<<"Time = "<< (dEnd - dStart)/1000<<endl; delete []buf; in.close(); out.close();}int main(int argc,_TCHAR* argv[]){ hugefile_rw2(); getchar(); return 0;}
测试发现 fstream 比 fwrite 效率低。
1 0
- C++ 读写大文件代码
- c语言大文件读写
- C语言 大文件读写
- 大文件读写——C语言
- 大文件读写——C语言
- C读写BMP文件代码(转载)
- C\C++对大文件的快速读写
- C\C++对大文件的快速读写
- linux c 读写超过2G的大文件解决办法
- 大文件读写
- PHP读写大文件
- linux读写大文件
- VS2008 读写大文件
- linux读写大文件
- C++ 大文件读写
- linux读写大文件
- shell读写大文件
- 【C/C++】文件读写
- java编译和执行
- Myeclipse使用技巧
- linux下mysql配置文件my.cnf最详细解释
- 无人机飞控平台ArduPilot源码入门教程 - 多线程
- Fresco 图片请求库(工具类)
- C++ 读写大文件代码
- KVC
- 直接在 PS 上使用 Google Font 字体:Fontea Photoshop 扩展工具推荐
- 数据库SQL优化大总结之 百万级数据库优化方案
- Linux之文件的操作(查看、创建、追加内容)
- Learning ArduPilot - UARTs and the Console
- Mysql Tomcat C3p0系统性能调优个人总结(赞!)
- 无语了,这让人森森感伤滴直男审美和手残!
- C++Builder6.0支持图片插入的TRichEdit增强