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