c++實(shí)現(xiàn)合并文件以及拆分實(shí)例代碼
本文主要研究的是c++實(shí)現(xiàn)合并文件以及拆分的相關(guān)內(nèi)容,分享了實(shí)現(xiàn)代碼,具體如下。
昨天看到一篇介紹TFS的文章,大意是為了處理海量圖片,采用分布式架構(gòu),將小圖片合并為大的文件
興趣驅(qū)使下,寫了一個(gè)簡(jiǎn)單的文件合并拆分程序
合并的方法很簡(jiǎn)單,將小文件寫入到大文件中,使用二進(jìn)制的方式。在大文件頭,用一個(gè)int記錄合并進(jìn)來(lái)的小文件的數(shù)量,接下來(lái),一塊一塊的寫入小文件。
每一塊都分為三個(gè)部分,第一部分是文件的名稱,用20個(gè)char 來(lái)記錄;第二部分用一個(gè)int來(lái)記錄小文件的長(zhǎng)度;第三部分則是小文件的實(shí)際內(nèi)容
這樣,在拆分時(shí),通過文件頭部獲得小文件的數(shù)量,然后逐個(gè)獲取名稱,文件長(zhǎng)度以及內(nèi)容
附上源代碼
合并:
void Merge()
{
char name[20];
string str1 = "F:/數(shù)據(jù)/1.jpg";
string str2 = "F:/數(shù)據(jù)/2.jpg";
string strBlock = "F:/數(shù)據(jù)/BLOCK.dat";
FILE* f1 = fopen(str1.c_str(),"rb+");
FILE* f2 = fopen(str2.c_str(),"rb+");
FILE* f3 = fopen(strBlock.c_str(),"rb+");
// 獲取文件的長(zhǎng)度
int iLen1 =filelength(fileno(f1));
int iLen2 = filelength(fileno(f2));
char *buf1 = new char[iLen1];
memset(buf1,0x0,iLen1);
char *buf2 = new char[iLen2];
memset(buf2,0x0,iLen2);
// 獲取文件內(nèi)容
fread(buf1,iLen1,1,f1);
fread(buf2,iLen2,1,f2);
fclose(f1);
fclose(f2);
// 在文件頭記錄合并文件的個(gè)數(shù)
int iCount = 2;
fseek(f3,0,SEEK_SET);
fwrite(&iCount,sizeof(int),1,f3);
// 寫入第一個(gè)文件
memset(name,0x0,20);
strcpy(name,str1.c_str());
fwrite(name,20,1,f3);
fwrite(&iLen1,sizeof(int),1,f3);
fwrite(buf1,iLen1,1,f3);
// 寫入第二個(gè)文件
memset(name,0x0,20);
strcpy(name,str2.c_str());
fwrite(name,20,1,f3);
fwrite(&iLen2,sizeof(int),1,f3);
fwrite(buf2,iLen2,1,f3);
fclose(f3);
//刪除申請(qǐng)的內(nèi)存
delete[] buf1;
delete[] buf2;
}
拆分:
void Split()
{
char name[20];
string strBlock = "F:/數(shù)據(jù)/BLOCK.dat";
FILE* f3 = fopen(strBlock.c_str(),"rb+");
// 獲取文件數(shù)量
int iCount = 0;
fseek(f3,0,SEEK_SET);
fread(&iCount,sizeof(int),1,f3);
for(int i=0;i<iCount;i++)
{
memset(name,0x0,20);
fread(&name,20,1,f3);
// 輸出名稱
cout<<name<<endl;
int iLen = 0;
// 讀取文件長(zhǎng)度
fread(&iLen,sizeof(int),1,f3);
char *buff = new char[iLen];
// 讀取文件內(nèi)容
fread(buff,iLen,1,f3);
char fileLen[10];
sprintf(fileLen, "%d", iLen);
// 以文件長(zhǎng)度做名稱
string s = fileLen;
string strName = "F:/數(shù)據(jù)/";
strName += s;
strName += string(".jpg") ;
// 新建一個(gè)文件
FILE* file= fopen(strName.c_str(),"wb+");
fwrite(buff,iLen,1,file);
fclose(file);
}
fclose(f3);
}
總結(jié)
以上就是本文關(guān)于c++實(shí)現(xiàn)合并文件以及拆分實(shí)例代碼的全部?jī)?nèi)容,希望對(duì)大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站其他相關(guān)專題,如有不足之處,歡迎留言指出。感謝朋友們對(duì)本站的支持!
相關(guān)文章
淺析Boost智能指針:scoped_ptr shared_ptr weak_ptr
雖然通過弱引用指針可以有效的解除循環(huán)引用,但這種方式必須在程序員能預(yù)見會(huì)出現(xiàn)循環(huán)引用的情況下才能使用,也可以是說這個(gè)僅僅是一種編譯期的解決方案,如果程序在運(yùn)行過程中出現(xiàn)了循環(huán)引用,還是會(huì)造成內(nèi)存泄漏的2013-09-09
C++ 遞歸遍歷文件并計(jì)算MD5的實(shí)例代碼
在本篇文章里小編給大家整理的是一篇關(guān)于C++ 遞歸遍歷文件并計(jì)算MD5的實(shí)例代碼,有興趣的朋友們可以學(xué)習(xí)參考下。2021-07-07
使用Qt實(shí)現(xiàn)旋轉(zhuǎn)動(dòng)畫效果
這篇文章主要為大家詳細(xì)介紹了如何使用Qt實(shí)現(xiàn)旋轉(zhuǎn)動(dòng)畫效果,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-11-11
VS2019中CMake項(xiàng)目的簡(jiǎn)單使用方法
這篇文章主要介紹了VS2019中CMake項(xiàng)目的簡(jiǎn)單使用方法,需要的朋友可以參考下2020-02-02
C++中實(shí)現(xiàn)多態(tài)有幾種方式小結(jié)
在C++中,多態(tài)是一種面向?qū)ο缶幊痰奶匦?允許以統(tǒng)一的方式處理不同類型的對(duì)象,并根據(jù)實(shí)際對(duì)象的類型來(lái)執(zhí)行相應(yīng)的操作,本文給大家介紹了C++中實(shí)現(xiàn)多態(tài)有幾種方式小結(jié),需要的朋友可以參考下2024-12-12

