?? rcwwork1.cpp
字號(hào):
// 題目要求:設(shè)計(jì)一個(gè)把若干小文件打包到一個(gè)大文件中的程序,
// 可以采用C/C++編程實(shí)現(xiàn)。程序需要完成以下功能:
// 1)把若干小文件打包到一個(gè)文件中;
// 2)把打包文件中的小文件恢復(fù)成原始文件(不改變文件類型);
// 3)瀏覽打包文件中都有哪些小文件,其文件名、擴(kuò)展名、長度等都是什么?
// 專業(yè):計(jì)算機(jī)科學(xué)與技術(shù) 班級(jí):064班
// 姓名:阮崇薇 學(xué)號(hào):06081421
// 設(shè)計(jì)完成日期:2008.10.25
// 程序說明(函數(shù)功能、參數(shù)、說明)
//writefile函數(shù)將被打包的文件打到目標(biāo)文件中去,
#include<iostream>
#include<string>
using namespace std;
struct File
{
char filename[20];
long filelength;
};
void writefile(FILE *fpsource,FILE *fpdest)
{
char *p;
p=new char[1024];
long length;
fseek(fpsource,0l,2);//將打包文件的指針位置移到該文件的尾部
length=ftell(fpsource);//打包文件的字節(jié)數(shù)
rewind(fpsource);//還原指針
while(length>=1024)//當(dāng)文件長度大于1024時(shí)
{
fread(p,1,1024,fpsource);
fwrite(p,1,1024,fpdest);
length-=1024;
}
fread(p,1,length,fpsource);//小于1024時(shí)以字符長度進(jìn)行讀寫
fwrite(p,1,length,fpdest);
delete []p;
}
int main()
{
int j;//選擇的操作數(shù)
long len;//文件的長度
File file;
while(1)
{
FILE *faim;//目標(biāo)文件
FILE *fp1;//待被打包的文件
char *p;
cout<<endl<<"------------------文件打包解壓操作---------------------"<<endl;
cout<<endl<<"1-打包文件; 2-分開打包后的文件";
cout<<endl<<"3-瀏覽打包后文件信息; 0-退出";
cout<<endl<<"請(qǐng)選擇操作類型: ";
cin>>j;
switch(j)
{
case 1:
cout<<"請(qǐng)輸入你要打包的文件名格式如下:"<<endl;
cout<<"名稱.擴(kuò)展名(現(xiàn)給出a.txt和b.txt,請(qǐng)選擇其一)"<<endl;
scanf("%s",file.filename);
if((fp1=fopen((file.filename),"rb"))==NULL)
{
cout<<"對(duì)不起沒有這個(gè)文件"<<endl;
}
else
{
p=new char[1024];
fseek(fp1,0l,2);//將打包文件的指針位置移到該文件的尾部
file.filelength=ftell(fp1);//打包文件的字節(jié)數(shù)
len=file.filelength;//待被打包文件長度
fseek(fp1,0l,SEEK_SET);//將打包文件指針位置放回開頭
faim=fopen("打包后的文件.t","ab+");//打開目標(biāo)文件
fwrite((char*)&file,sizeof(struct File),1,faim);//將文件信息寫進(jìn)目標(biāo)文件
writefile(fp1,faim);//用函數(shù)寫文件的內(nèi)容
cout<<"文件"<<file.filename<<"打包成功;"<<endl;
fclose(fp1);//關(guān)閉文件
remove(file.filename);
fclose(faim);//關(guān)閉文件
delete []p;//釋放空間
}
break;
case 2:
faim=fopen("打包后的文件.t","rb");//打開目標(biāo)文件
if(faim==NULL)
{
cout<<"文件未打包,請(qǐng)選擇1 進(jìn)行文件打包。"<<endl;
}else
{
fseek(faim,0l,SEEK_END);
len=ftell(faim);
rewind(faim);
p=new char[1024];
long length,temp;
while(len>0)
{
fread((char *)&file,sizeof(struct File),1,faim);
length=file.filelength;
temp=file.filelength;
fp1=fopen(file.filename,"ab+");
cout<<"\t"<<file.filename<<"\t"<<file.filelength<<endl;
while(length>=1024)
{
fread(p,1024l,1,faim);//將打包文件的全部內(nèi)容傳入p
fwrite(p,1024l,1,fp1);//將p的東西全部傳給目標(biāo)文件
length=length-1024;
}
fread(p,length,1,faim);//將打包文件的全部內(nèi)容傳入p
fwrite(p,length,1,fp1);//將p的東西全部傳給目標(biāo)文件
len=len-sizeof(struct File)-temp;
fclose(fp1);//關(guān)閉文件
}delete []p;
fclose(faim);//關(guān)閉文件
cout<<endl<<">>文件分開完成<<"<<endl;
}
remove("打包后的文件.t");
break;
case 3:
faim=fopen("打包后的文件.t","rb");//打開目標(biāo)文件
if(faim==NULL)
{
cout<<"文件未打包,請(qǐng)選擇1 進(jìn)行文件打包。"<<endl;
}else
{
fseek(faim,0l,SEEK_END);
len=ftell(faim);
rewind(faim);
cout<<"\t"<<"文件名 "<<"\t"<<"字節(jié)數(shù) "<<endl;
faim=fopen("打包后的文件.t","rb");
while(len>0)
{
fread((char *)&file,sizeof(struct File),1,faim);
cout<<"\t"<<file.filename<<"\t"<<file.filelength<<endl;
fseek(faim,file.filelength,SEEK_CUR);
len=len-file.filelength-sizeof(struct File);
}
remove("打包后的文件.t");
}
break;
case 0:
exit(0);
default:
cout<<"對(duì)不起請(qǐng)輸入正確的選項(xiàng)"<<endl;break;
}
}
return 0;
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -