исключение: неверный нулевой указатель при загрузке объекта, сохраненного в файле - PullRequest
0 голосов
/ 29 декабря 2018

Итак, я пытался сохранить данные всей структуры в файл и затем прочитать их обратно из файла, который вы можете увидеть здесь, в моем коде. Я записываю данные в структуру (введенную пользователем), которая затем сохраняется вфайл, использующий функцию myFile.write для сохранения объекта

Как показано в приведенном ниже коде, когда программа запускается в первый раз, и я ввожу данные после этого, когда снова возвращаюсь в меню, а затем нажимаю 2 для загрузки данных.работает и загружает данные успешно (что я думаю). после этого он возвращается в меню, и я нажимаю 3, и он показывает все созданные мной рейсы (очевидно, потому что данные в настоящее время находятся в основной памяти и не готовятся по файлу)

    //Global Variables
    string savedFlight = "airportsDB\\SavedFlights.txt"; //path
    const unsigned short NUMBER_OF_AIRPORTS = 8;
    int gFlightSize=0;
    ifstream rFlightData;
    ofstream wFlightData;
    //SKipped some part
    struct flight {
    airport depature;
    airport arrival;
    double crsAlt;
    double distance;
    double fuel;
    void flight::createFlight();
    void flight::showFlight();
};

    void flight::createFlight() {
            cout << "Please insert depature airport (ICAO) : ";
            cin>>depature.icao;

        if(searchapt(depature.icao)){
            cout << "Please insert arrival airport (ICAO) : ";
            cin>>arrival.icao;

                if(searchapt(arrival.icao)){
                    cout<<"Enter Cruise Altitude [3000<Altitude<50000]  : ";
                    cin>>crsAlt;

                    if(crsAlt>50000 || crsAlt<3000){
                    cout<<"Unable CruiseAltitude Please put DIGITS* between 50,000ft and 3,000ft ";
                    }
                    else{
                        //CNTINUE HERE
                    }
            }

            else{
            cout<<"Arrival Airport Does Not Exist In DataBase";
            }
        }
        else{
            cout<<"Departure Airport Does Not Exist In DataBase";
        }
}

    void flight::showFlight(){
                        cout<<"\n Departure Airport : "<<depature.icao
                        <<"\n Arrival   Airport : "<<arrival.icao
                        <<"\n Cruise Altitude   : "<<crsAlt
                        <<"\n\n__________________________________________________\n\n";
    }

    //(Skipped some part)
        void writeFlightData(){
        int i=gFlightSize;
        cout<<"How many flights do you want to add : ";
        cin>>gFlightSize;
        saveCounter(gFlightSize);

    flights=new flight[gFlightSize];

    wFlightData.open(savedFlight,ios::app);

    textColor(12);
    cout<<"USE UPPERCASE LETTER !\n";
    textColor(15);

    while(i<gFlightSize){
            flights[i].createFlight();
            wFlightData.write((char *)&flights[i], sizeof(flights[i]));
            i++;
    }
    wFlightData.close();
}

void loadFlightData(){

    rFlightData.open(savedFlight);// , ios::in); // open file for reading

    cout << "  Loading Saved flights from disk";
    for(int i=3;i>0;i--){ //REVERSE LOOP FOR A TWIST
                cout<<" . ";
                Sleep(800);
            }
    cls 

    if(rFlightData.fail()){
        cout << "\nAn error occured while loading Saved Flights from disk .The file is corrupt or does not exist on the specified path\n\a"<<"\n Press any key to go back to the menu";
        saveCounter(0);
        _getch();
        cls
    }
    else{   

        Sleep(1000);
        for (int i = 0; i < gFlightSize; i++) {
            rFlightData.read((char *)&flights[i], sizeof(flights[i])); // read an object from a file
        }
        cout<<"  Data Load Successfull!  ";
        rFlightData.close(); // close the file
    }
}

Я сохраняю счетчик добавлений, который считывается при повторном запуске программы, и он знает размер добавленных мною рейсов

Теперь проблема в том, когда я закрываю эту программу и снова запускаю ее, инажмите 2, чтобы загрузить данные, данные не загружаются, но происходит сбой и выдается ошибка исключения «Неверный нулевой указатель»

* Ошибка отладки!Программа C: \ Windows \ SYSTEM32 \ MSVCP110D.dll Файл: f \ dd \ vctools \ crt_bld \ self_x86_ \ crt \ src \ istream Строка: 734

Выражение: недопустимый нулевой указатель

Для информациио том, как ... (Нажмите Retry для отладки приложения)

*

1 Ответ

0 голосов
/ 29 декабря 2018

Я исправил это сам, извините, что вопрос был немного неясен.это было логической ошибкой, так как я использовал динамический массив структуры, получая данные от пользователя аналогичным образом, когда я пытался загрузить данные, я не назначил указателю новое динамическое расположение, где мог бы быть создан массив структуры, а затем загрузил данные вструктура в программе, так что все, что мне нужно было сделать, это написать

flights=new flight[gFlightSize];

в моей функции loaddata следующим образом, так что перед загрузкой динамическое расположение может быть назначено в основной памяти структуре, где затем могут быть данныезагружен в

void loadFlightData(){
flights=new flight[gFlightSize];
rFlightData.open(savedFlight);// , ios::in); // open file for reading

cout << "  Loading Saved flights from disk";
for(int i=3;i>0;i--){ //REVERSE LOOP FOR A TWIST
            cout<<" . ";
            Sleep(800);
        }
cls 

if(rFlightData.fail()){
    cout << "\nAn error occured while loading Saved Flights from disk .The file is corrupt or does not exist on the specified path\n\a"<<"\n Press any key to go back to the menu";
    saveCounter(0);
    _getch();
    cls
}
else{   

    Sleep(1000);
    for (int i = 0; i < gFlightSize; i++) {
        rFlightData.read((char *)&flights[i], sizeof(flights[i])); // read an object from a file
    }
    cout<<"  Data Load Successfull!  ";
    rFlightData.close(); // close the file
}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...