读书人

懂LZW算法的大神进来帮忙调试下吧。小

发布时间: 2012-06-06 16:44:11 作者: rapoo

懂LZW算法的大神进来帮忙调试下吧。。小弟快崩溃了。。。
先不说程序的效率问题,我觉得我的算法还是有问题,还有就是对图片无法压缩解压。求各位大神了。。。

C/C++ code
#define DIC_SIZE    65536  //2的16次方  #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);char *en_isFindDic(UNIT preCode);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++;            count++;        }    }    en_dic[i+1].character=END;}/*头字节写入函数*/void headBytes(FILE *outFile){    int i;    DIC headEnd;    FILE *fp;    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);    }//压缩函数void compression(char inFileName[20],char outFileName[20]){    //char *prefix,*suffix;    FILE *inFile,*outFile,*fp;    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,"rb"))){        printf("源文件打开失败!\n");        return ;    }    if(!(outFile=fopen(outFileName,"wb"))){        printf("目标文件建立失败!\n");        return ;    }    headBytes(outFile); //首先写入头字节         buffer=(char *)malloc(1000);    prefix=(char *)malloc(1000);     suffix=(char *)malloc(1000);    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)*1000); //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]){    UNIT currCode,preCode;    char *currStr,*preStr;    int dateFrom=1,dicNum=0;    FILE *inFile,*outFile;    int i;    char *p=(char *)malloc(sizeof(char)*100),c;    char *buffer=(char *)malloc(sizeof(char)*100);        if(!(inFile=fopen(inFileName,"rb"))){        printf("源文件打开失败!\n");        return ;    }    if(!(outFile=fopen(outFileName,"wb"))){        printf("目标文件建立失败!\n");        return ;    }    for(i=0;;i++){        de_dic[i].character=(char *)malloc(sizeof(char)*2);//重复分配问题         fread(&de_dic[i],sizeof(DIC),1,inFile);        dicNum++;        if(de_dic[i].character==HEAD_END){            break;            }        dateFrom++;    }    dicNum--;    fseek(inFile,sizeof(DIC)*dateFrom,SEEK_SET);        fread(&preCode,sizeof(UNIT),1,inFile);    fread(&currCode,sizeof(UNIT),1,inFile);    while(!feof(inFile)){        if((currStr=en_isFindDic(currCode))!=NULL)        {            preStr=en_isFindDic(preCode);            fputs(preStr,outFile);            strcpy(p,preStr);            c=*currStr;            sprintf(buffer,"%s%c",p,c);            de_dic[dicNum].character=(char *)malloc(sizeof(char)*100);     //realloc            strcpy(de_dic[dicNum].character,buffer);    //添加到字典             de_dic[dicNum].code=dicNum;            de_dic[++dicNum].character=END;        }        else        {            preStr=en_isFindDic(preCode);            strcpy(p,preStr);            c=*preStr;            sprintf(buffer,"%s%c",p,c);            fputs(buffer,outFile);            de_dic[dicNum].character=(char *)malloc(sizeof(char)*1000);     //realloc            strcpy(de_dic[dicNum].character,buffer);    //添加到字典             de_dic[dicNum].code=dicNum;            de_dic[++dicNum].character=END;        }        preCode=currCode;        fread(&currCode,sizeof(UNIT),1,inFile);    }    printf("解压缩成功!\n");    fclose(inFile);    fclose(outFile);        }char *en_isFindDic(UNIT preCode){    int i=0;    char *preStr;        while(END!=de_dic[i].character){        if(preCode==de_dic[i].code){            preStr=de_dic[i].character;            return preStr;        }        i++;        }    return FALSE;}/*查找函数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;        while(1){    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;} 



[解决办法]
不要把
fopen("...","...");fscanf,fprintf,fclose //读时把\r\n替换成\n,写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待

fopen("...","...b");fread,fwrite,fclose //不作以上替换,遇到\x1a仍继续读;读写的内容当字节看待
弄混了

读书人网 >C语言

热点推荐