首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

小弟我将结构体写入文件,可是无法正常读出

2012-06-06 
我将结构体写入文件,可是无法正常读出头字节的部分在decompression函数中无法正常读出,我这样写有问题吗?C

我将结构体写入文件,可是无法正常读出
头字节的部分在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;} 



[解决办法]
参考这篇文章:
把结构用二进制方式写入文件,并读出来

热点排行
Bad Request.