排序-关于文件指针的一个错误

问题描述

关于文件指针的一个错误

 /************************************************************************************/
 /*      著作権所有者  :                                                              /
 /*      文件名        :电子地图管理系统                                             */
 /*      内容          : 对一个二进制地图文件进行处理,排序,检索,更新              */
 /*      日期: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("
");
    printf("/***                电子地图导航系统              ***/");
    printf("
");
    printf("/***           team9  陈永胜 李想 孙林桐          ***/");
    printf("
 ");
    printf("/***                    2015.7.31                 ***/");
    printf("
 ");
    printf("/****************************************************/");
}
void UI2(){
    printf("
");
    printf("请选择服务的种类:");
    printf("
");
    printf("                  1.读取文件(“./data/GTBL.dat”)");
    printf("
");
    printf("                  2.排序(快速排序)并输出排序结果(“./data/SortGTBL.dat”)");
    printf("
");
    printf("                  3.检索");
    printf("
");
    printf("                  4.更新");
    printf("
");
    printf("                  0.退出");
    printf("
");
    printf("                   请选择");
}

void server(){
    int n;
    FILE *p;
    scanf("%d",&n);
    switch(n){
    case 1:
        rf(); //调用读取文件函数
        printf("文件读取成功!
");
        printf("Success!
");
        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:dataa.txt","r");
        M_t1++;
        RD(p);
        UI2();
        server();
        break;
    case 2:
        if(M_t1 == 0){
            printf("请先读取文件,输入1
");
            UI2();
            server();
        }
        else if(M_t1 == 1){
            M_t2++;
            sort();
        }    //调用排序文件函数
        break;
    case 3:
        if(M_t1 ==0 || M_t2 ==0)
        {
            printf("先读取并排序文件,才可以检索
");
            UI2();
            server();
        }
        else
        {
            search();
        }
                                       //调用搜索文件函数
        break;
    case 4:
            if(M_t1 ==0 || M_t2 ==0)
        {
            printf("先读取并排序文件,才可以更新
");
            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:dataGTBL.dat","rb+");
    pl=fopen("f:dataa.txt","w");

    if(p==NULL)
    {
        printf("文件不存在!
");
    }
    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,"#	");
            fprintf(pl,"LinkID=");
            fprintf(pl,"%d	",road_t.road[nsizecount].ullinkId);
            fprintf(pl,"flag=");
            fprintf(pl,"%d	",road_t.road[nsizecount].usroadnameflag);
            fprintf(pl,"brunch");
            fprintf(pl,"%d	",road_t.road[nsizecount].usbrunch);
            fprintf(pl,"dispclass=");
            fprintf(pl,"%d	",road_t.road[nsizecount].usdispclass);
            fprintf(pl,"Roadname=1=");
            fprintf(pl,"%s	",road_t.road[nsizecount].roadname+4);
            fprintf(pl,"#");
            fprintf(pl,"
");
            nsizecount++;

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

    return nsizecount;
}   

void update(){

}

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

    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("
请输入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("

 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
",road_t.road[i].ullinkId);
        }
        break;
    case 2:
        printf("	请输入交叉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("
没有匹配结果,请重新选择");
            }
        }
        break;
    case 3:
        printf("	请输入岔路数:");
        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("
没有匹配结果,请重新选择");
                    break;
                }
            break;
    case 4:
        printf("请输入道路名称:");
        scanf("%s",name);
        break;
    case 0:
        system("cls");
        UI2();
        server();
        break;
    default:
        printf("输入错误,请重新输入
");
        search();
    }
}

void sort(){
}

void RD(FILE *p)
{       

    if( M_t1 != 0)
    {
        int i=0;
        printf("
			文件信息----写入内存中... ...
");
        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("
			 文件信息----写入内存成功

");
        UI1();
        server();
    }
    else
    {
        UI1();
        server();
    }
}

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

解决方案

读文件的一个错误
有关指针的一个错误
一个空指针错误

解决方案二:

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

解决方案三:

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

解决方案四:

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

时间: 2024-10-30 11:51:20

排序-关于文件指针的一个错误的相关文章

C语言打开一个电脑中的文件,文件指针显示是错误的指针,这是为什么

问题描述 C语言打开一个电脑中的文件,文件指针显示是错误的指针,这是为什么 FILE *fp1: printf("请输入要打开的文件的位置:"); gets(file1); if((fp1=fopen(file1,"r"))==NULL) { printf("Can't open this file!n"); exit(0); } 对话框中显示为 请输入要打开的文件的位置:D:a.docx 此时逐语句调试时,局部变量fp1的值显示为+ fp1 0

carchive-CArchive的文件指针位置和CFile的文件指针位置是一样的么?

问题描述 CArchive的文件指针位置和CFile的文件指针位置是一样的么? void Add::OnClickedIdbAdd() { // TODO: Add your control notification handler code here UpdateData(); if (!m_aComp || !m_aEng || !m_aMath || !m_aGym || m_aName=="" || m_aSno=="" || m_aMajor=="

c++-C++下如何从读取文件内的数据并且排序然后输出到另外一个文件

问题描述 C++下如何从读取文件内的数据并且排序然后输出到另外一个文件 如题 大一新手 自学太累了 希望有引路人 拜托各位了 谢谢! 解决方案 即便你学会了,写起来也要好多行,建议你用C#吧.实现整个需求只要1行代码就行了: File.WriteAllLines("输出文件.txt", File.ReadAllLines("文件名.txt").OrderBy(x => 排序条件)); 解决方案二: 自学太累?是你没有用心吧.偶也是自学走过来的,非计算机及相关专

服务器打不开一个php文件,出现500错误

问题描述 服务器打不开一个php文件,出现500错误 服务器打不开一个php文件 除了这个文件,其他php文件都正常运行,然后权限是777,这应该是什么问题呢? php文件里写phpinfo()运行不了 解决方案 [上传到服务器后的问题]某一个页面打不开Wowza 服务器打不开

指针-MFC 我想用主线程写东西到一个文件,同时一个线程从同一文件读东西出来

问题描述 MFC 我想用主线程写东西到一个文件,同时一个线程从同一文件读东西出来 怎么弄?两个文件指针?因为是同一个文件,怎么办?主线程给那个线程传参数时用什么参数,文件的指针?句柄?如果是句柄怎么获得啊? 解决方案 文件有独占打开,有共享打开.你这种情况,肯定得共享打开.你没有说具体的环境,所以很难进一步描述.最简单的就是两个线程各自用共享模式打开同一个文件.期间应该会有一些同步的操作,要注意就可以了 解决方案二: 你需要告诉具体的环境,才能详细描述 解决方案三: CFile:Open()的第

文件中有一组整数,要求排序后输出到另一个文件中

 这个主要复习一下文件输入输出流~~ //文件中有一组整数,要求排序后输出到另一个文件中 #include <iostream> #include <fstream> //文件输入输出流 #include <vector> using namespace std; int main() { ifstream InFile("in.txt"); if(InFile.good()) { cout<<"open file succe

Foxpro数据库连接错误解决方法--【VFP DBF文件不是一个有效的路径。 确定路径名称拼写是否正确,以及是否连接到文件存放的服务器】

直接访问vfp dbf文件时报错: 错误描述: 'd:\vfpData\test.dbf'不是一个有效的路径. 确定路径名称拼写是否正确,以及是否连接到文件存放的服务器. 解决办法:Data Source=目录!!!!!!(d:\vfpData) (1)------------------------------------------------------------------------------------------------ Microsoft Jet OLE DB 4.0 S

用gdb配合内核转储文件瞬间定位段错误

前几天在写一个使用Huffman算法的文本压缩程序时被"段错误"折磨了好长时间.因为自己向来对内存的使用保持着"克勤克俭"的作风,所以总是被此类错误折磨的焦头难额.C语言的内存管理本来就是一个繁琐的工作,写代码时略有不慎便会出现诸如"段错误(吐核)"的运行时崩溃. 其实段错误是操作系统的一个内存保护机制,一般情况下某程序尝试访问其许可范围之外的内存空间时便会触发内核的"一般保护性异常",内核便会向程序发送一个SIGSEGV(1

代码-请问这个程序怎么修改,总是提示一个错误

问题描述 请问这个程序怎么修改,总是提示一个错误 #include#include#include#include#define N 3#define M 10int add = N-1;int sum[N]={0}Max[N]Min[N];float aver[N]={0};struct player{ int num; char name[8]; int score[M];}PL;void Inistplayer(PL player[]int n){ int i; for(i=0;i sca