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
原创粉丝点击