文件分隔读写

C++ 读写大文件代码

 

可读写大于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;//每次读写的大小,此处为10M
void 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;//每次读写的大小,此处为10M

void 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 效率低。

转载自:https://blog.csdn.net/a379039233/article/details/51491655

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值