A. c语言 文本文件压缩
再发次,有80分呢哎
B. 如何用c语言压缩解压文件夹
压缩是一种有效的减小数据量的方法,目前已经被广泛应用于各种类型的信息系统之中。 一种压缩文本文件的方法如下: 1. 原始文本文件中的非字母的字符,直接拷贝到压缩文件中; 2. 原始文件中的词(全部由字母组成),如果是第一次出现,则将该词加入到一个词的列表中,并拷贝到压缩文件中;否则该词不拷贝到压缩文件中,而是将该词在词的列表中的位置拷贝到压缩文件中。 3. 词的列表的起始位置为 1 。 词的定义为文本中由大小写字母组成的最大序列。大写字母和小写字母认为是不同的字母,即 abc 和 Abc 是不同的词。词的例子如下: * x-ray 包括两个词 x 和 ray * mary's 包括两个词 mary 和 s * a c-Dec 包括三个词 a 和 c 和 Dec 编写一个程序,输入为一组字符串,输出为压缩后的文本。输入: 输入为一段文本,你可以假设输入中不会出现数字、每行的长度不会超过 80 个字符,并且输入文本的大小不会超过 10M。输出:压缩后的文本。输入:Please, please do it–it would please Mary very,very much.Thanks输出:Please, please do it–4 would 2 Mary very,7 much.Thanks
#include<stdlib.h>#include<stdio.h>#include<string.h>#defineLEN1<<20intisArabic(charc){return('a'<=c&&c<='z')||('A'<=c&&c<='Z');}intmain(){chardict[LEN];char*index[100000];charbuf[82];intnword=0;inti,j;charc;char*inFile="G:\in.txt",*outFile="G:\out.txt";FILE*inp,*outp;if((inp=fopen(inFile,"r"))==NULL){printf("cannotopen");exit(1);}if((outp=fopen(outFile,"w"))==NULL){printf("outfail");}index[0]=dict;do{/*getaword*/i=0;do{c=fgetc(inp);buf[i++]=c;}while(isArabic(c));buf[i-1]=0;/*putittodict*/if(i>1){for(j=0;j<nWord;j++){if(strcmp(index[j],buf)==0){break;}}if(j==nWord){strcpy(index[nWord],buf);index[nWord+1]=index[nWord]+strlen(buf)+1;nWord++;/*printf("new:%s",buf);*/}else{sprintf(buf,"%d",j+1);/*printf("found:%s",buf);*/}}/*putittooutputfile*/if(c!=EOF)fprintf(outp,"%s%c",buf,c);elsefprintf(outp,"%s",buf);}while(c!=EOF);fclose(inp);fclose(outp);/*system("PAUSE");*/returnEXIT_SUCCESS;}
C. C语言实现文件压缩
typedef int (WINAPI ICEPUB_COMPRESSFILE)(char *strFilename, char *strZipFilename);ICEPUB_COMPRESSFILE *icePub_compressFile = 0;HINSTANCE hDLLDrv = LoadLibrary("icePubDll.dll");if(hDLLDrv){_compressFile = (ICEPUB_COMPRESSFILE *)GetProcAddress(hDLLDrv, "icePub_compressFile");}if(icePub_compressFile)icePub_compressFile("a.exe","a.Z");if(hDLLDrv)FreeLibrary(hDLLDrv);typedef int (WINAPI ICEPUB_UNCOMPRESSFILE)(char *strZipFilename,char *strFilename);ICEPUB_UNCOMPRESSFILE *icePub_uncompressFile = 0;HINSTANCE hDLLDrv = LoadLibrary("icePubDll.dll");if(hDLLDrv){icePub_uncompressFile = (ICEPUB_UNCOMPRESSFILE *)GetProcAddress(hDLLDrv, "icePub_uncompressFile");}if(icePub_uncompressFile)icePub_uncompressFile("a.Z","a.exe");if(hDLLDrv)FreeLibrary(hDLLDrv);
D. c语言压缩文本文件 求解答!
可以考虑用一个map 键值对 来存放 的首次出现单词,一个单词对应一个序号然后一行一行进行读取,对每一行里的字符 只要不是字母 就截取来 和 map、中已有的单词进行比较 重复的 就取出序号代替 不重复的 放进map这样就好了你需要一个获取单词的函数 一个压缩单词的函数 一个比较单词的函数 把这3个函数做出来 你的程序 大致就好了这个 你自己想比较好 和简单其实求采纳为满意回答。
E. 如何用C语言解压缩文件
如果你自己设复计算法,就另当别论制,如果想利用第3方的算法,我推荐用zlib,生成的压缩包是流行的zip格式.源代码很好找(www.zlib.net)
F. 用C语言简单演示如何借助zlib库实现文件的压缩和解压缩
问题的根源在于这些网友对于字符串和字节流的概念非常的模糊,对文本文件和二进制文件的区别常常模棱两可,其实字节流可以表示所有的数据,二进制文件才是任何文件的本质。字节流是一个字节接一个字节,并没有结束符号,所以需要给它一个长度信息。二进制文件是一个字节接一个字节,并没有换行符之类的。文件压缩的时候,可以通过源文件的长度自动计算缓冲区的长度,压缩后写入目标文件之前,需先保留源文件和目标数据的长度作为解压缩的依据,参考如下代码:#include #include #include int main(int argc, char* argv[]) { FILE* file; uLong flen; unsigned char* fbuf = NULL; uLong clen; unsigned char* cbuf = NULL; /* 通过命令行参数将srcfile文件的数据压缩后存放到dstfile文件中 */ if(argc < 3) { printf("Usage: zcdemo srcfile dstfile\n"); return -1; } if((file = fopen(argv[1], "rb")) == NULL) { printf("Can\'t open %s!\n", argv[1]); return -1; } /* 装载源文件数据到缓冲区 */ fseek(file, 0L, SEEK_END); /* 跳到文件末尾 */ flen = ftell(file); /* 获取文件长度 */ fseek(file, 0L, SEEK_SET); if((fbuf = (unsigned char*)malloc(sizeof(unsigned char) * flen)) == NULL) { printf("No enough memory!\n"); fclose(file); return -1; } fread(fbuf, sizeof(unsigned char), flen, file); /* 压缩数据 */ clen = compressBound(flen); if((cbuf = (unsigned char*)malloc(sizeof(unsigned char) * clen)) == NULL) { printf("No enough memory!\n"); fclose(file); return -1; } if(compress(cbuf, &clen, fbuf, flen) != Z_OK) { printf("Compress %s failed!\n", argv[1]); return -1; } fclose(file); if((file = fopen(argv[2], "wb")) == NULL) { printf("Can\'t create %s!\n", argv[2]); return -1; } /* 保存压缩后的数据到目标文件 */ fwrite(&flen, sizeof(uLong), 1, file); /* 写入源文件长度 */ fwrite(&clen, sizeof(uLong), 1, file); /* 写入目标数据长度 */ fwrite(cbuf, sizeof(unsigned char), clen, file); fclose(file); free(fbuf); free(cbuf); return 0; }文件解压缩的时候,可以通过保留信息得到缓冲区和数据流的大小,这样解压缩后直接保存即可,参考如下代码:#include #include #include int main(int argc, char* argv[]) { FILE* file; uLong flen; unsigned char* fbuf = NULL; uLong ulen; unsigned char* ubuf = NULL; /* 通过命令行参数将srcfile文件的数据解压缩后存放到dstfile文件中 */ if(argc < 3) { printf("Usage: zudemo srcfile dstfile\n"); return -1; } if((file = fopen(argv[1], "rb")) == NULL) { printf("Can\'t open %s!\n", argv[1]); return -1; } /* 装载源文件数据到缓冲区 */ fread(&ulen, sizeof(uLong), 1, file); /* 获取缓冲区大小 */ fread(&flen, sizeof(uLong), 1, file); /* 获取数据流大小 */ if((fbuf = (unsigned char*)malloc(sizeof(unsigned char) * flen)) == NULL) { printf("No enough memory!\n"); fclose(file); return -1; } fread(fbuf, sizeof(unsigned char), flen, file); /* 解压缩数据 */ if((ubuf = (unsigned char*)malloc(sizeof(unsigned char) * ulen)) == NULL) { printf("No enough memory!\n"); fclose(file); return -1; } if(uncompress(ubuf, &ulen, fbuf, flen) != Z_OK) { printf("Uncompress %s failed!\n", argv[1]); return -1; } fclose(file); if((file = fopen(argv[2], "wb")) == NULL) { printf("Can\'t create %s!\n", argv[2]); return -1; } /* 保存解压缩后的数据到目标文件 */ fwrite(ubuf, sizeof(unsigned char), ulen, file); fclose(file); free(fbuf); free(ubuf); return 0; }
G. c语言压缩文本文件 求解答
#include"stdio.h"#include"string.h"#include"malloc.h"#defineMOD_ADLER65521#defineHASHMAX1000#defineMAX_INT9999999//最大读取数字为99999999#defineCHARBUFLEN40960#defineDECOMPRESSINITLEN1024structstringInfo{intNo;//字符串出现的次序char*str;//字符串structstringInfo*next;//下一节点}*strTable[HASHMAX];//用于压缩intisCompress;char**strTableDe;//解压缩表,用于解压缩longdeTableLen;//解压缩表长度longcurStrNum;//目前的字符串数量//程序初始化voidinit(){inti;curStrNum=1;isCompress=1;//压缩模式,等于0时解压缩if(isCompress){for(i=0;i<HASHMAX;i++)strTable[i]=NULL;deTableLen=0;strTableDe=NULL;}else{deTableLen=DECOMPRESSINITLEN;strTableDe=(char**)malloc(deTableLen*sizeof(char*));for(i=0;i<deTableLen;i++)strTableDe[i]=NULL;}}//重新申请内存voidReMallocDeTable(){deTableLen<<=1;strTableDe=(char**)realloc(strTableDe,deTableLen*sizeof(char*));}//程序结束,释放内存voidover(){inti;structstringInfo*pNext,*pDel;for(i=0;i<HASHMAX;i++){pNext=strTable[i];while(pNext){free(pNext->str);pDel=pNext;pNext=pNext->next;free(pDel);}}if(strTableDe){for(i=0;i<curStrNum;i++){//printf("%d%s",i,strTableDe[i]);free(strTableDe[i]);}free(strTableDe);}}//adler32校验和算法unsignedlongadler32(unsignedchar*data,size_tlen){unsignedlonga=1,b=0;size_tindex;for(index=0;index<len;++index){a=(a+data[index])%MOD_ADLER;b=(b+a)%MOD_ADLER;}return(b<<16)|a;}//求字符串的Hash,实现快速查找,这里用的是adler32算法,可以使用其它任何hash方法unsignedlongHash(constchar*str){returnadler32((unsignedchar*)str,strlen(str))%HASHMAX;}//复制新字符串char*NewStr(constchar*str){char*r=(char*)malloc(strlen(str)+1);strcpy(r,str);returnr;}//取得字符串出现的次序intgetStrPos(constchar*str){unsignedlonghash;structstringInfo*pFirst,*pNext,*pNew;hash=Hash(str);pNext=pFirst=strTable[hash];while(pNext){if(strcmp(pNext->str,str)==0)returnpNext->No;pNext=pNext->next;}//没有找到匹配的字符串pNew=(structstringInfo*)malloc(sizeof(structstringInfo));pNew->next=NULL;pNew->No=curStrNum++;pNew->str=NewStr(str);if(pFirst==NULL)strTable[hash]=pNew;else{pNext=pFirst;while(pNext->next)pNext=pNext->next;pNext->next=pNew;}return-1;}//读取字符串,字符串以空格为结束符//返回负数的绝对值是读取的是字符串长度,正数为读取的数字intReadStr(char*out,constchar*in){char*po,*pn;constchar*pi;intr;po=out;pi=in;while(('a'<=*pi&&*pi<='z')||('A'<=*pi&&*pi<='Z')||('0'<=*pi&&*pi<='9'))*po++=*pi++;//只复制大小写字母和数字*po=0;//试着转化为纯数字r=0;pn=out;while('0'<=*pn&&*pn<='9'){if(r>MAX_INT)break;r*=10;r+=*pn++-'0';}if(*pn)returnout-po;//未成功转化为数字elsereturn(r&0x7FFFFFF)|(((po-out)&0xF)<<27);}voidmain(){charreadFileBuf[CHARBUFLEN],readStrBuf[CHARBUFLEN];char*prfb;intnum;FILE*fpr,*fpw;fpr=fopen("source.txt","r");//输入文件fpw=fopen("object.txt","w");//输出文件if(fpr==NULL||fpw==NULL)return;init();while(!feof(fpr)){if(fgets(readFileBuf,CHARBUFLEN-1,fpr)==NULL)break;prfb=readFileBuf;while(*prfb){num=ReadStr(readStrBuf,prfb);if(num==0)fputc(*prfb++,fpw);//没有读取成功elseif(num>0)//读入数字{prfb+=(num>>27)&0xF;//移动读取的位数if(isCompress)fprintf(fpw,"0%d",num&0x7FFFFFF);//压缩模式写入数字,前面添加个数字0else{num&=0x7FFFFFF;if(num==0)//如果读到数字0{prfb+=1;num=ReadStr(readStrBuf,prfb);//读取下一格数据串if(num>0){prfb+=(num>>27)&0xF;//移动读取的位数fprintf(fpw,"%d",num&0x7FFFFFF);}elsefprintf(fpw,"0",num&0x7FFFFFF);//下一个不是数字}elseif(num<curStrNum)fprintf(fpw,"%s",strTableDe[num]);//解压模式写入字符串else{printf("Error:%d,%d",num,curStrNum);fprintf(fpw,"%d",num);//num大于已知的字符串数量,写入数字}}}else{num=-num;prfb+=num;//移动读取的位数if(isCompress){num=getStrPos(readStrBuf);if(num<0)fprintf(fpw,"%s",readStrBuf);//未出现过的字符串elsefprintf(fpw,"%d",num);//写入位置}else{fprintf(fpw,"%s",readStrBuf);if(curStrNum>=deTableLen)ReMallocDeTable();//解压表长度不够,重新申请空间strTableDe[curStrNum++]=NewStr(readStrBuf);//加入解压表}}}}if(isCompress)printf("Compresssuccessful!");elseprintf("DecompressSuccessful!");over();}
H. c语言编写文件压缩程序的设计思路 急啊
这个,我来觉得应该找一个成源熟的库,看需求了,比如Huffman算法的,或者直接开源的zlib之类的,然后你的c调用库的API接口,就可以了。其实你的c代码只是对库的功能的一个简单封装,最多提供一些带压缩的文件从哪里来,要放到哪里去这些。数据压缩是一个很大的课题,看你的需求了。
I. 用C语言如何对文件进行压缩
winrar软件安装后,所在的安装目录下有个rar.exe,开一个命令窗口到该目录下运行rar/?就能看到用法了,在你的程序里面调用它的相应命令行是最简单的方法,自己编写压缩算法的话,先不谈效率,起码算法就是相当复杂的了