磁盘文件的读取和存入问题,请帮我解决

问题遇到的现象和发生背景

总体描述:本程序实现了通过C++语言,实现了对于民航飞机以及地图等信息的简易管理。从txt文件中读取城市信息,通过此程序对于城市信息的增添、删除以及修改后,设置飞机信息,判断飞机是否可以降落,并查询飞机雷达半径中所有城市的信息。
按照实现菜单给出每个选项的功能:
1、增加城市信息
2、删除城市信息
3、修改城市信息
4、保存城市信息至文件
5、从文件读取城市信息
6、显示所有城市信息
7、设置飞机信息
8、显示飞机信息
9、判断起飞飞机是否可以刹车
10、查询飞机雷达半径内所有城市信息
0、询问用户是否确定退出
(1)void appendCity(Map& mapObj);//追加城市记录
实现:提示用户输入城市信息,然后通过mapObj对象调用AddCity()成员函数将输入的城市信息追加到线性表尾部。
(2)void delCity(Map& mapObj); // 删除城市记录
实现:提示用户输入城市编号,则通过mapObj对象调用FindCity()判断城市是否存在,若存在,则通过mapObj对象调用DeleteCity()成员函数删除对应的城市信息,否则显示信息:该城市不存在。
(3)void updCity(Map& mapObj);//修改城市记录
实现:提示用户输入城市编号,然后通过mapObj对象调用FindCity()成员函数查询到城市编号对应的数据存在后,首先显示该城市信息,提示输入新数据,然后修改对应的城市信息。
(4)void SaveToFile(Map& mapObj);//保存城市信息,写入磁盘文件
实现:提示用户输入磁盘文件名,通过mapObj对象调用SaveCity()成员函数,按照文件格式将所有城市信息写入该磁盘中。
(5)void ReadFroFile(Map& mapObj);//从磁盘文件读取城市信息
实现:提示用户输入磁盘文件名,通过mapObj对象调用ReadCity()成员函数,按照文件格式从磁盘文件读取城市信息,追加入地图信息列表中。
(6)void ShowAllCities(Map& mapObj);//显示全部城市信息
实现:判断若线性表中有城市,则通过mapObj对象调用ShowCities()成员函数,显示当前地图信息列表中所有的城市信息;否则显示:当前没有城市信息。
(7)void AddPlane(Plane& planeObj);//输入飞机信息
实现:提示用户输入飞机信息,通过planeObj对象调用SetPlane()成员函数将输入的信息写入飞机对象中。
(8)void ShowPlane(Plane& planeObj);//显示飞机信息
实现:通过planeObj对象调用show()成员函数,显示当前飞机对象中的各种信息。
(9)void Brake(Plane& planeObj);//判断起飞时是否可以刹车
实现:提示输入当前飞机的速度和剩余跑道长度,通过planeObj对象调用CanBrake()成员函数,该函数返回是否可以刹车的信息。根据返回值输出对应的结果,返回1显示可以刹车,返回0显示不可以刹车,返回-1显示没有飞机信息。
(10)void RadarSearch(Plane& planeObj, Map& mapObj);//计算所有城市的距离,小于飞机雷达范围内的城市,显示其城市信息
实现:提示输入雷达扫描半径,通过对象planeObj调用RadarFind()成员函数,显示距当前飞机在雷达扫描半径内所有的城市信息
(0)char Quit(Map& mapObj);//退出处理
实现:询问用户是否确定退出,用户可输入一个字符’y’或’n’,若用户回答’y’,则将通过mapObj对象调用SaveCity()成员函数将cities[]内容写入数据文件database.txt。本函数返回用户回答的字符’y’或’n。

文档名为map.txt
内容为

img

问题相关代码,请勿粘贴截图
#include <iostream>
#include <fstream>
#include <iomanip>
#include <cstring>
#include <cmath>
#include <bits/stdc++.h>
using namespace std;
class City  //定义一个类City用于表示城市各种信息
{
private:  //私有数据成员:城市的编号,名称,坐标
    int number;  //城市编号
    char name[25];  //城市名称
    int x,y;        //城市坐标
public:    //公有成员函数:如下
    City(int num=1000,const char na[25]=" ",int xpos=0,int ypos=0)   //构造函数,各参数均有缺省值
    {
        number=num;
        strcpy(name,na);
        x=xpos;y=ypos;
    }
    void setNumber(int num)  //设置城市编号
    {
        number=num;
    }
    void setName(char *na)  //设置城市名称
    {
        strcpy(name,na);
    }
    void setPosition(int xpos,int ypos)   //设置城市坐标
    {
        x=xpos;y=ypos;
    }
    void getName(char *);
    int getNum()    //读取城市编号
    {
        return number;
    }
    int getX()      //读取城市x轴坐标
    {
        return x;
    }
    int getY()      //读取城市y轴坐标
    {
        return y;
    }
    void show()     //输出城市的编号,名称,坐标
    {
        cout.setf(ios::left,ios::adjustfield);
        cout<<setw(8)<<number<<setw(10)<<name<<setw(5)<<x<<setw(5)<<y<<endl;
    }
    friend class Map;    //定义Map为City的友元函数
};
void City::getName(char *na)    //在类外定义,读取城市名称
{
    strcpy(na,name);
}
class Map   //定义一个类,地图信息记录
{
private:     //私有数据成员
    City *cities;    //City类型指针,指向一个动态申请的对象数组,每一个元素是一个城市信息的记录,数组相当于cities【maxCounter】    
    int curCounter,maxCounter;   //现有城市记录,线性表最大长度
public:       //公有成员函数
    Map(int maxc=10)    //构造函数,初始化城市信息列表,即动态申请线性表空间
    {
        curCounter = 0;
        maxCounter = maxc;
        if (maxc)
            cities = new City[maxCounter];
        else
            cities = NULL;
    }
    void ReadCity(char *filename)        //将文件中的城市信息读取并追加到内存地图信 息列表里
    {
        fstream infile;
        infile.open(filename,ios::in);
        while(!infile.eof())
        {
            if(curCounter==maxCounter)
            {
                City *newcities;
                newcities=new City[maxCounter+10];
                for(int i=0;i<curCounter;i++)
                {
                    newcities[i]=cities[i];
                }
                delete []cities;
                maxCounter=maxCounter+10;
                cities=newcities;
            }
            infile>>cities[curCounter].number>>cities[curCounter].name>>cities[curCounter].x>>cities[curCounter].y;
            curCounter++;
        }
        infile.close();
    }
    void ImportDataBase()   //判断若文件append.text存在,则调用ReadCity()函数将文件内容读入cities【】中,若文件不存在,不报错。
    {
        fstream infile;
        infile.open("append.txt",ios::in);
        if(infile)
        {char* name=(char*)"append.txt";
            ReadCity(name);
        }
        infile.close();
    }
    Map(Map &m)   //拷贝构造函数
    {
        cities=new City[maxCounter];
        for(int i=0;i<maxCounter;i++)
        {
            cities[i]=m.cities[i];
            curCounter=m.curCounter;
            maxCounter=m.maxCounter;
        }
    }
    ~Map()     //析构函数,释放线性表空间
    {
        delete [] cities;
    }
    double Distance(int x1,int y1,int x2,int y2)      //计算两坐标之间的距离
    {
        double d=(x1-x2)*(x1-x2)+(y1-y2)*(y1-y2);
        d=sqrt(d);
        return d;
    }
    void AddCity(int num,char *na,int x,int y)
                                  //在地图信息列表的最后增加一个新的城市信息,参数是城市编号,城市数据 ,城市坐标
    {
        City city(num,na,x,y);
        if(curCounter==maxCounter)
        {
            City *newcities;
            newcities=new City[maxCounter+10];
            for(int i=0;i<curCounter;i++)
            {
                newcities[i]=cities[i];
            }
            delete []cities;
            maxCounter=maxCounter+10;
            cities=newcities;
        }
        cities[curCounter++]=city;
    }
    void DeleteCity(int m)    //根据城市编号删除城市信息
    {
        int n=0,i,j;
        for( i=0;i<curCounter;i++)
            if(cities[i].number==m)
                for(j=i;j<curCounter-1;j++)
                    cities[j]=cities[j+1];
        curCounter--;
    }
    void SaveCity(char *filename)   //将城市地图信息列表cities【】中的信息存入文件filename中
    {
        fstream outfile;
        outfile.open(filename,ios::out);
        outfile<<curCounter<<endl;
        for(int i=0;i<curCounter;i++)
        {
            outfile.setf(ios::left,ios::adjustfield);
            outfile<<setw(8)<<cities[i].number<<setw(10)<<cities[i].name<<setw(5)<<cities[i].x<<setw(5)<<cities[i].y<<endl;
        }
        outfile.close();
    }
    void UpdateCity(int i,int num,char *na,int x,int y)
    {
        for(int j=0;j<curCounter;j++)
            if(cities[j].number==i)
            {
                cities[i].number=num;
                strcpy(cities[i].name,na);
                cities[i].x=x;
                cities[i].y=y;
            }
    }
    int FindCity(int num)  //根据城市编号查找城市信息,返回下标,若不存在则返回-1.
    {
        for(int i=0;i<curCounter;i++)
            if(cities[i].number==num)
                return i;
        return -1;
    }
    void showCities()    //显示全部城市信息
    {
        for(int i=0;i<curCounter;i++)
            cities[i].show();
    }
    int GetCurCounter()   //读取当前城市数量
    {
        return curCounter;
    }
    int GetPostionX(int i)   //返回下标为i的城市坐标x
    {
        return cities[i].x;
    }
    int GetPostionY(int i)   //返回下标为i的城市坐标y

    {
        return cities[i].y;
    }
    void ShowCity(int i)    //显示下标为i的城市信息
    {
        cities[i].show();
    }
};
class Plane    //定于一一个类,飞机信息记录
{
private:    //私有数据成员
    int number;  //飞机编号
    char name[25];   //飞机名称
    int x,y;    //飞机坐标x,y
    double weight;   //飞机重量,吨
public:     //公有成员函数
    Plane(int num=1000,const char na[25]=" ",int xpos=0,int ypos=0,double w=0) 
//构造函数,各参数均有缺省值
    {
        number=num;
        strcpy(name,na);
        x=xpos;y=ypos;
        weight=w;
    }
    void show()    //显示一架飞机的信息
    {
        cout.setf(ios::left,ios::adjustfield);
        cout<<setw(10)<<"飞机编号"<<setw(10)<<"飞机名称"<<setw(10)<<"飞机坐标x"<<setw(12)<<"飞机坐标y"<<setw(11)<<"质量"<<endl;
        cout<<setw(10)<<number<<setw(11)<<name<<setw(11)<<x<<setw(11)<<y<<setw(10)<<weight<<endl;
    }
    
    int CanBrake(double v,double reDistance)    //判断飞机是否可以刹车,v为当前飞机速度,reDistance为剩余跑道长度
    {
        if(weight=0)
            return -1;
        if(weight*v/5<reDistance)
            return 1;
        else return 0;
    }
    void RadarFind(double radarRadius,Map mapObj)     //根据飞机当前坐标以及雷达扫描半径,扫描地图信息,将半径以内的城市信息显示出来
    {
        int m=mapObj.GetCurCounter();
        for(int i=0;i<m;i++)
        {
            int x1=mapObj.GetPostionX(i);
            int y1=mapObj.GetPostionX(i);
            if((x1-x)*(x1-x)+(y1-y)*(y1-y)<radarRadius)
                mapObj.ShowCity(i);
        }
    }
    
    void SetPlane(int num,char *na,double w,int xpos,int ypos)    //设置飞机信息
    {
        number=num;
        strcpy(name,na);
        x=xpos;y=ypos;
        weight=w;
    }
};
int menu_select()
{
    int num;
    cout << "*****************************************"<<endl;
    cout << "1.增加城市信息" << endl;
    cout << "2.删除城市信息" << endl;
    cout << "3.修改城市信息" << endl;
    cout << "4.保存城市信息至文件" << endl;
    cout << "5.从文件读取城市信息"<<endl;
    cout << "6.显示所有城市信息\n";
    cout << "7.设置飞机信息\n";
    cout << "8.显示飞机信息\n";
    cout << "9.判断起飞飞机是否可以刹车\n";
    cout << "10.查询飞机雷达半径内所有城市信息\n";
    cout << "0.退出\n";
    cout << "*****************************************"<<endl;
    do
    {
        cout << "请输入选择:";
        cin >> num;
        system("cls");
    } while (num < 0 || num>10);
    return num;
}
void appendCity(Map &mapObj)   //追加城市记录
{
    int num,x,y;
    char na[25]={"\0"};
    cout<<"请输入城市信息:";
    cin>>num>>na>>x>>y;
    mapObj.AddCity(num,na,x,y);
}
void delCity(Map &mapObj)   //删除成城市纪录
{
    int num;
    cout<<"请输入城市编号:";
    cin>>num;
    if(mapObj.FindCity(num)!=-1)
    {
        char c;
        cout<<"是否确定删除该城市(y/n):";
        cin>>c;
        switch(c)
        {
            case('y'||'Y'):
                mapObj.DeleteCity(num);
            default:break;
        }
    }
    else
        cout<<"该城市不存在"<<endl;
}
void updCity(Map &mapObj)   //修改城市记录
{
    int num,x,y;
    char na[25]={"\0"};
    cout<<"请输入城市编号:";
    cin>>num;
    int i=mapObj.FindCity(num);
    if(i!=-1)
    {
        cout<<"请输入城市信息:";
        cin>>na>>x>>y;
        mapObj.UpdateCity(i,num,na,x,y);
    }
    else
        cout<<"该城市不存在"<<endl;
}
void SaveToFile(Map &mapObj)   //保存城市信息,写入磁盘文件
{
    char name[25]={"\0"};
    cout<<"请输入磁盘文件名:";
    cin>>name;
    mapObj.SaveCity(name);
}
void ReadFromFile(Map &mapObj)    //从磁盘文件中读取当前城市信息
{
    char name[25]={"\0"};
    cout<<"请输入磁盘文件名:";
    cin>>name;
    mapObj.ReadCity(name);
}
void ShowAllCities(Map &mapObj)  //展示所有城市信息
{
    if(mapObj.GetCurCounter()>0)
        mapObj.showCities();
    else 
        cout<<"当前没有城市信息"<<endl;
}
void AddPlane(Plane &planeObj)  //输入飞机信息
{
    int num,x,y,w;
    char na[25]={"\0"};
    cout<<"请输入飞机信息:";
    cout << "飞机编号:";
    cin >> num;
    cout << "飞机名称:";
    cin >> na;
    cout << "飞机重量(吨):";
    cin >> w;
    cout << "飞机坐标(x,y):";
    cin >> x >> y;
    planeObj.SetPlane(num,na,w,x,y);
}
void ShowPlane(Plane &planeObj)   //显示飞机信息
{
    planeObj.show();
}
void Brake(Plane &planeObj)      //判断起飞时是否可以刹车
{
    double reDistance,sp;
    cout<<"请输入飞机的速度(km/h):"<<endl;
    cin>>sp;
  cout<<"剩余跑道的长度(m):"<<endl;
cin>>reDistance;
    if(planeObj.CanBrake(sp,reDistance)==1)
        cout<<"可以刹车"<<endl;
    else if(planeObj.CanBrake(sp,reDistance)==0)
        cout<<"不可以刹车"<<endl;
    else
        cout<<"没有飞机信息"<<endl;
}
void RadarSearch(Plane &planeObj, Map &mapObj)   //显示planeObj与mapObj中所有的城市距离小于雷达半径的城市信息
{
    double radarRadius=0;
    cout<<"请输入雷达扫描半径(km):";
    cin>>radarRadius;
    planeObj.RadarFind(radarRadius,mapObj);
}
char Quit(Map &mapObj)    //退出处理
{
    char c;
    cout<<"是否确定退出:";
    cin>>c;
    if(c=='y')
    {char* name=(char*)"map.txt";
        mapObj.SaveCity(name);
        return 'y';
    }
    if(c=='n')
        return 'n';
    return 0;        
}
int main()    //主函数
{
    Map mapObj;   //定义地图对象
    Plane planeObj;  //定义飞机对象
    int sel=0;
    for( ; ; )
    {
        switch(sel=menu_select( ))
        {
             case 1: appendCity(mapObj);     //追加城市记录
                     system("pause");
                     break;
             case 2: delCity(mapObj);      //删除城市记录
                     system("pause");
                     break;
             case 3: updCity(mapObj);    //修改城市记录
                     system("pause");
                     break;
             case 4: SaveToFile(mapObj);    //保存城市信息,写入磁盘文件
                     system("pause");
                     break;
             case 5: ReadFromFile(mapObj);   //从磁盘文件中读取城市信息
                     system("pause");
                     break;
             case 6: ShowAllCities(mapObj);    //展示全部城市信息
                     system("pause");
                     break;
             case 7: AddPlane(planeObj);        //输入飞机信息
                     system("pause");break;
                     break;
             case 8: ShowPlane(planeObj);      //显示飞机信息
                     system("pause");
                     break;
             case 9: Brake(planeObj);    //判断飞机起飞是否可以刹车
                     system("pause");
                     break;
             case 10:RadarSearch(planeObj, mapObj);    //显示当前在飞机雷达扫描半径以内的所有城市信息
                     system("pause");
                     break;
             case 0: if(Quit(mapObj)!='y')   //退出处理
                         continue; 
        }
        if(sel==0)
            break;
    }
    return 0;
} 


运行结果及报错内容

程序几乎可以运行,但是无法进行磁盘文件读取,就比如程序的"case5"无法显示文件内容,其他还有不合适的地方请指出来,谢谢

我的解答思路和尝试过的方法
我想要达到的结果

程序能够基本按照要求运行起来,可将修改后的程序发给我
不能大改


    void ReadCity(char *filename)        //将文件中的城市信息读取并追加到内存地图信 息列表里
    {
        fstream infile;
        infile.open(filename,ios::in);
        int  cityC ;
        infile>>cityC; 
        while(!infile.eof())
        {
            if(curCounter==maxCounter)
            {
                City *newcities;
                newcities=new City[maxCounter+10];
                for(int i=0;i<curCounter;i++)
                {
                    newcities[i]=cities[i];
                }
                delete []cities;
                maxCounter=maxCounter+10;
                cities=newcities;
            }
            infile>>cities[curCounter].number>>cities[curCounter].name>>cities[curCounter].x>>cities[curCounter].y;
            curCounter++;
        }
        infile.close();
    }

用上面的替代你原来的就可以正确读取啦。
不过这仅仅是功能上的可用。

不过读取上的逻辑可能还有问题,因为重复读取同一个文件,会让数据持续增加,即存在重复城市数据。

我帮你看下

读取信息的格式和实际文件的格式不匹配:第一行内容只有一个数字,和第二行及之后的数据读取格式不同

你跟踪一下代码,看看void ReadCity(char *filename)有没有读到文件
(文件是否需要完整路径)