小弟我将结构体写入文件,可是无法正常读出
我将结构体写入文件,可是无法正常读出
头字节的部分在decompression函数中无法正常读出,我这样写有问题吗?
头字节的部分在decompression函数中无法正常读出,我这样写有问题吗?
- C/C++ code
#define DIC_SIZE 65536 //2的16次方 #define INIT_SIZE 256 #define TRUE 1 #define FALSE 0 #define END NULL #define HEAD_END NULL #include <stdio.h> #include <string.h> #include <stdlib.h> typedef unsigned short int UNIT; typedef struct dictionary{ char *character; UNIT code; }DIC; DIC de_dic[DIC_SIZE]; DIC en_dic[DIC_SIZE]; int count=0; int codeNum=0; //int findDicFrom=0; DIC *isFindDic(char *buffer); DIC *findInDic(char *prefix); char *toString(char c); //初始化函数 /*void initDic() { int i; char ch=1; for(i=0;i<256;i++){ //sprintf(&ch,"%c",i+1); string_tab[i].character=toString(i+1); string_tab[i].code=i+1; printf("%c ",string_tab[i].character); printf("%d\n",string_tab[i].code); count++; } string_tab[i+1].character=END; }*/ void initDic(char *inFileName) { FILE *inFile; char *buffer=(char *)malloc(sizeof(char)*2); int i=0; if(!(inFile=fopen(inFileName,"r"))){ printf("源文件打开失败!\n"); return; } en_dic[0].character=END; while(fgets(buffer,2,inFile)){ if(!isFindDic(buffer)){ en_dic[i].character=(char *)malloc(sizeof(char)*2);//如何释放 strcpy(en_dic[i].character,buffer); en_dic[i].code=i; i++; en_dic[i].character=END; count++; codeNum++; } } } /*头字节写入函数*/ void headBytes(FILE *outFile) { int i; DIC headEnd; for(i=0;i<count;i++) fwrite(en_dic+i,sizeof(DIC),1,outFile); //en_dic[i+1].character=END; headEnd.character=HEAD_END; //count++; fwrite(&headEnd,sizeof(DIC),1,outFile); } /*字符转换为字符串 * * char *toString(char c) { char buffStr[10]; buffStr[0]=c; buffStr[1]='\0'; return buffStr; }*/ //压缩函数 void compression(char inFileName[20],char outFileName[20]) { //char *prefix,*suffix; FILE *inFile,*outFile; char *buffer; //用realloc来分配空间 int i; char *prefix,*suffix; //int cIsInDic=TRUE; DIC *curBuffer; int buffSize,charSize; int s; char code[10]; if(!(inFile=fopen(inFileName,"r"))){ printf("源文件打开失败!\n"); return ; } if(!(outFile=fopen(outFileName,"w"))){ printf("目标文件建立失败!\n"); return ; } headBytes(outFile); //首先写入头字节 buffer=(char *)malloc(100); prefix=(char *)malloc(100); suffix=(char *)malloc(100); //prefix=fgetc(inFile); //suffix=fgetc(inFile); fgets(prefix,2,inFile); fgets(suffix,2,inFile); while(!feof(inFile)) { strcpy(buffer,prefix); strcat(buffer,suffix); if(curBuffer=isFindDic(buffer)){ //itoa(curBuffer->code,code,10); //fputs(code,outFile); //printf("%s",code); //验证 strcpy(prefix,buffer); if(fgets(suffix,2,inFile)==NULL){ curBuffer=findInDic(prefix); itoa(curBuffer->code,code,10); //fputs(code,outFile); fwrite(&curBuffer->code,sizeof(UNIT),1,outFile); printf("%s",code); break; } } else{ buffSize=(strlen(buffer)+1)*4; en_dic[count].character=(char *)malloc(charSize=sizeof(char)*20); //realloc s=sizeof(en_dic[count].character); //if(buffSize>charSize) //en_dic[count].character=realloc(en_dic[count].character,buffSize+1); strcpy(en_dic[count].character,buffer); en_dic[count].code=count; en_dic[++count].character=END; //将P+s添加到词典中 curBuffer=findInDic(prefix); itoa(curBuffer->code,code,10); //fputs(code,outFile); fwrite(&curBuffer->code,sizeof(UNIT),1,outFile); printf("%s",code); //验证 strcpy(prefix,suffix); if(fgets(suffix,2,inFile)==NULL){ curBuffer=findInDic(suffix); itoa(curBuffer->code,code,10); //fputs(code,outFile); fwrite(&curBuffer->code,sizeof(UNIT),1,outFile); printf("%s",code); break; } } } free(prefix); free(suffix); free(buffer); fclose(inFile); fclose(outFile); } /*解压缩函数*/ void deCompression(char inFileName[20],char outFileName[20]) { FILE *inFile,*outFile; char *buffer; int i; char *prefix,*suffix; DIC *curBuffer; int buffSize,charSize; int s; char code[10]; int currCode,preCode; char currStr,preStr; if(!(inFile=fopen(inFileName,"rb"))){ printf("源文件打开失败!\n"); return ; } if(!(outFile=fopen(outFileName,"wb"))){ printf("目标文件建立失败!\n"); return ; } for(i=0;fread(de_dic[i+1].character == HEAD_END);i++){ de_dic[i].character=(char *)malloc(sizeof(char)*2); fread(de_dic+i,sizeof(DIC),1,inFile); } } /*查找函数1 *判断当前字串是否存在于字典当中 *若存在返回结构体指针,若不存在返回FALSE */ DIC *isFindDic(char *buffer) { int i=0; DIC *curBuffer; while(END!=en_dic[i].character){ if(!strcmp(en_dic[i].character,buffer)){ curBuffer=&en_dic[i]; return curBuffer; } i++; } return FALSE; } /*查找函数2*/ DIC *findInDic(char *prefix) { int i=0; DIC *curBuffer; while(END!=en_dic[i].character){ if(!strcmp(en_dic[i].character,prefix)){ curBuffer=&en_dic[i]; return curBuffer; } i++; } } int main(int argc, char *argv[]) { char en_inFileName[20],en_outFileName[20]; char de_inFileName[20],de_outFileName[20]; int key; printf("1-压缩,2-解压\n"); scanf("%d",&key); switch(key){ case 1: fflush(stdin); gets(en_inFileName); fflush(stdin); gets(en_outFileName); initDic(en_inFileName); compression(en_inFileName,en_outFileName); break; case 2: fflush(stdin); gets(de_inFileName); fflush(stdin); gets(de_outFileName); deCompression(de_inFileName,de_outFileName); break; } //initDic(en_inFileName); //compression(en_inFileName,en_outFileName); //free(character) printf("压缩成功!\n"); return 0; }