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

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