关于文件指针的一个错误


 /************************************************************************************/
 /*      著作権所有者  :                                                              /
 /*      文件名        :电子地图管理系统                                             */
 /*      内容          : 对一个二进制地图文件进行处理,排序,检索,更新              */                                 
 /*      日期:2015-7-31                                                           */
 /*                                                                                   */
 /*                                                                                   */
 /*************************************************************************************/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<windows.h>
#include<malloc.h>
#include<conio.h>

void UI1(); //基本服务界面
void UI2();//会持续出现的服务选择界面
void server();//服务信息,提示用户输入数字
int rf();
void sort();
void search();
void RD(FILE *p);
void update();


int nsizecount=2;

int n = rf();

struct RoadRecord
{
    short ussize;
    long ullinkId;
    int usdispclass;
    int usbrunch;
    int usroadnameflag;
    char roadname[20];
};
struct  Map_t
{
    struct RoadRecord road[700000] ;

}*s,*ss;
struct  Map_t road_t;

int M_t1 = 0;
int M_t2 = 0;

#define MCGETLONG(data)  (  ( ((unsigned  long)MCGETSHORT((data)))<<16 )|( ((unsigned long)MCGETSHORT((char *)(data)+2))&0x0000ffff))
#define MCGET3BN(data)  (  (((unsigned long )MCGETCHAR((data)))<<16)|(((unsigned long)MCGETSHORT((char *)(data+1))&0x0000ffff)) 
#define MCGETCHAR(data) (*((char *)(data)))
#define MCGETSHORT(data)((unsigned short)((((unsigned short)(*((char *)(data))))<<8)|(((unsigned short)(*((char *)(data)+1)))&0x00ff)))
#define Length 700000



void  UI1(){
    printf("/********************---Welcome!---*******************");
    printf("\n");
    printf("/***                电子地图导航系统              ***/");
    printf("\n");
    printf("/***           team9  陈永胜 李想 孙林桐          ***/");
    printf("\n ");
    printf("/***                    2015.7.31                 ***/");
    printf("\n ");                         
    printf("/****************************************************/");
}
void UI2(){
    printf("\n");
    printf("请选择服务的种类:");
    printf("\n");
    printf("                  1.读取文件(“./data/GTBL.dat”)");
    printf("\n");
    printf("                  2.排序(快速排序)并输出排序结果(“./data/SortGTBL.dat”)");
    printf("\n");
    printf("                  3.检索");
    printf("\n");
    printf("                  4.更新");
    printf("\n");
    printf("                  0.退出");
    printf("\n");
    printf("                   请选择");
}

void server(){
    int n;
    FILE *p;
    scanf("%d",&n);
    switch(n){
    case 1:
        rf(); //调用读取文件函数
        printf("文件读取成功!\n");
        printf("Success!\n");
        s=(struct Map_t*)malloc(sizeof(struct Map_t)*(nsizecount-2));
        ss=(struct Map_t*)malloc(sizeof(struct Map_t)*(nsizecount-2));
        p=fopen("d:\\data\\a.txt","r");
        M_t1++;
        RD(p);
        UI2();
        server();
        break;
    case 2:
        if(M_t1 == 0){
            printf("请先读取文件,输入1 \n");
            UI2();
            server();
        }
        else if(M_t1 == 1){
            M_t2++;
            sort();
        }    //调用排序文件函数
        break;
    case 3: 
        if(M_t1 ==0 || M_t2 ==0)
        {
            printf("先读取并排序文件,才可以检索\n");
            UI2();
            server();
        }
        else
        {
            search();
        }
                                       //调用搜索文件函数
        break;
    case 4:
            if(M_t1 ==0 || M_t2 ==0)
        {
            printf("先读取并排序文件,才可以更新\n");
            UI2();
            server();
        }
        else
        {
            update();  
        }//调用更新文件函数
        break;
    case 0:
        exit(0);     //调用退出函数
        break;
    default : 
        printf("输入错误请重新输入:");
        server();
        break;
    }



}

 int rf(){
    int m;
    char aclinkId[4];
    char acroadnamesize[2];
    char acRecordinfo[4];

    unsigned short ustotalsize;
    unsigned long ullinkId;
    unsigned short usroadnamesize;
    char actotalsize[2];

    FILE *p;  FILE *pl; 
    p=fopen("f:\\data\\GTBL.dat","rb+");
    pl=fopen("f:\\data\\a.txt","w");

    if(p==NULL)
    {
        printf("文件不存在!\n");
    }
    else
    {   
    while(fread(actotalsize,sizeof(actotalsize),1,p)==1)
        {
            fread(aclinkId,sizeof(aclinkId),1,p);
            fread(acroadnamesize,sizeof(acroadnamesize),1,p);
            fread(acRecordinfo ,sizeof(acRecordinfo),1,p);
            ustotalsize=MCGETSHORT(actotalsize);    
            ullinkId=MCGETLONG(aclinkId);
            usroadnamesize=MCGETSHORT(acroadnamesize);

            road_t.road[nsizecount].ussize=ustotalsize;
            road_t.road[nsizecount].ullinkId=ullinkId;
            m=(int)acRecordinfo[3]&255;
            road_t.road[nsizecount].usdispclass=m&15;
            road_t.road[nsizecount].usbrunch=(m&112)/16;
            road_t.road[nsizecount].usroadnameflag=(m&128)/128;

            fread(road_t.road[nsizecount].roadname,sizeof(char),ustotalsize-12,p);

            fprintf(pl,"#\t");
            fprintf(pl,"LinkID=");
            fprintf(pl,"%d\t",road_t.road[nsizecount].ullinkId);
            fprintf(pl,"flag=");
            fprintf(pl,"%d\t",road_t.road[nsizecount].usroadnameflag);
            fprintf(pl,"brunch");
            fprintf(pl,"%d\t",road_t.road[nsizecount].usbrunch);
            fprintf(pl,"dispclass=");
            fprintf(pl,"%d\t",road_t.road[nsizecount].usdispclass);
            fprintf(pl,"Roadname=1=");
            fprintf(pl,"%s\t",road_t.road[nsizecount].roadname+4);
            fprintf(pl,"#");
            fprintf(pl,"\n");
            nsizecount++;

        }
     fclose(p);
     fclose(pl);
    //  printf("%d",nsizecount);
    }

    return nsizecount;
}   


void update(){

}


void search(){
    printf("请选择检索的方式:\n");
    printf("             1.指定linkID检索\n");
    printf("             2.指定交叉Link列表示ClassF番号 检索\n");
    printf("             3.指定查找岔路数 检索\n");
    printf("             4.指定道路名称 检索\n");
    printf("             0.返回\n");

    int n;
    int linkID;
    int fh;
    int cl;
    int count1=0;
    int count2=0;
    char name;
    scanf("%d",&n);

    int count = 0;
    switch(n)
    {
    case 1:
        int low,high;           
        int key;        
        int mid;
        low = 0;
        high = nsizecount - 1;
        printf("\n请输入LinkID:");

        scanf("%d",key);

        while(low<high)
        {   
            count++;
            mid = (low + high)/2;
            if(key<road_t.road[mid].ullinkId)
                high = mid - 1;
            else if(key > road_t.road[mid].ullinkId)
                low = mid + 1;
            else if(key==road_t.road[mid].ullinkId)
            {
                printf("\n\n LinkID=%s  ",road_t.road[mid].ullinkId);
                printf("flag=%s  ",road_t.road[mid].usroadnameflag);
                printf("brunch=%s",road_t.road[mid].usbrunch);
                printf("displace=%s",road_t.road[mid].usdispclass);
                printf("Roadname=%s",road_t.road[mid].roadname+4);
                break;
            }
        }

        int i;
        for(i=0;i<=1000;i++)
        {
            printf("%d\n",road_t.road[i].ullinkId);
        }
        break;
    case 2:
        printf("\t请输入交叉link列表示class番号:");
        scanf("%s",&fh);
        for (i=0;i<n-2;i++)
        {
            if (fh==road_t.road[i].usdispclass)
            {
                printf("%d",road_t.road[i].usdispclass);
                count1++;
            }
            if (count1==0)
            {
                printf("\n没有匹配结果,请重新选择");
            }
        }
        break;
    case 3:
        printf("\t请输入岔路数:");
        scanf("%d",&cl);
        for (i=0;i<n-2;i++){
            if (cl==road_t.road[i].usbrunch)
            {
                printf("%d",road_t.road[i].usbrunch);
                count2++;
            }

            }
            if (count2==0)
                {
                    printf("\n没有匹配结果,请重新选择");
                    break;
                }
            break;
    case 4:
        printf("请输入道路名称:");
        scanf("%s",name);
        break;
    case 0:
        system("cls");
        UI2();
        server();
        break;
    default:
        printf("输入错误,请重新输入\n");
        search();
    }
}


void sort(){
}

void RD(FILE *p)
{       

    if( M_t1 != 0)
    {   
        int i=0;
        printf("\n\t\t\t文件信息----写入内存中... ...\n");
        for(i=0;i<n-2;i++)
        {
            fscanf(p,"%s",road_t.road[i].ullinkId);
            fscanf(p,"%s",road_t.road[i].usroadnameflag);
            fscanf(p,"%s",road_t.road[i].usbrunch);
            fscanf(p,"%s",road_t.road[i].usdispclass);
            fscanf(p,"%s",road_t.road[i].roadname); 
        }
        if(road_t.road[5].ullinkId != NULL)
            printf("\n\t\t\t 文件信息----写入内存成功\n\n");
        UI1();
        server();
    }
    else
    {
        UI1();
        server();
    }
}

int main()
{
    UI1();
    UI2();
    server();
    return 0;
}

http://download.csdn.net/detail/monster88ra/4928285

什么错误呢?没有看到,也不喜欢猜。

请给出问题所在,乐意解答……