0

我想要做的是让用户输入一个密钥代码,如果它匹配显示数据输入文件上的信息。我收到了这个错误,我不知道是什么原因。

std::out_of_range 在内存位置 0x0043f7c4..

下面是我的输入文件和我的代码

HEA,EMA,British Airways,030,025
HEA,EMA,Thomas Cook Airlines,020,040
HEA,DUB,British Airways,420,450
HEA,DUB,Thomas Cook Airlines,400,550
EMA,BAR,British Airways,120,140
EMA,BAR,Thomas Cook Airlines,100,150
ROM,EMA,British Airways, 120,125
ROM,EMA,Thomas Cook Airlines,150,090
ROM,BAR,British Airways,106,050
ROM,BAR,Thomas Cook Airlines,100,080
BAR,HEA,British Airways,125,090
BAR,HEA,Thomas Cook Airlines,100,120
DUB,EMA,Thomas Cook Airlines,450,380
DUB,EMA,Thomas Cook Airlines,420,450

下面是我的 C++ 代码

#include <vector>
#include "stdafx.h"
#include <iostream>
#include <string>
#include <fstream>
#include <sstream>

//#include "TravelFunctions.h"




using namespace std;



vector<string>flightDetails;
vector<string>flightSearch;
string airportDepart;
string airportArrive;
bool errorArrive = false;
bool errorDepart = false;
string timeTaken;
int tax;
int cost;
bool needtoentercodes = false;
string entry;


 int main()
{
    // first i will read in the airport.txt data and store the information into a vector.
ifstream flightdata("flightinfo.txt");
    string flightnextline;
    if (!flightdata)
    {
         cout << "Cannot Open the file 'flightdata.txt'";
    }
    else
    {
         while (flightdata.good())
        {
            getline (flightdata, flightnextline);
            flightDetails.push_back(flightnextline);

         }
        flightdata.close();

    }







cout << " ___________________ " << endl;
cout << "|  Airport Key Code |" << endl;
cout << "|EMA = East Midlands|" << endl;
cout << "|HEA = Heathrow     |" << endl;
cout << "|BAR = Barcelona    |" << endl;
cout << "|ROM = ROME         |" << endl;
cout << "|DUB = DUBAI        |" << endl;
cout << "|                   |" << endl;
cout << "|___________________|" << endl;
cout << endl;
cout << endl;
cout << endl;




 entry = "Please enter the ID code of the starting destination.\n";

while (needtoentercodes == false)
{

    cout<< entry;
    cout << "Use the key above to see which airports are available. \n"; 
    string userdepartid;
    cin>> userdepartid;
    bool k = false;

    //VALIDATING USER INPUT FOR DEPARTURE AIRPORT CODE - As mentioned above, this little section validates the starting departure id code.
    while (k==false){
        if ((userdepartid != "HEA") && (userdepartid != "EMA") && (userdepartid != "DUB") && (userdepartid != "BAR") && (userdepartid != "ROM"))
        {
            cout << "You have entered an incorrect departure code.\nPlease Try Again...\n";
            cin >> userdepartid;
        }
        else
        {
            k=true;
        }
    }

    cout << "\n";
    cout << "Please enter the code of the arrival destination.\n";
    string userarrivalid;
    cin >> userarrivalid;

    //VALIDATING USER INPUT FOR ARRIVAL AIRPORT CODE - This little section of code validates the arrival id airport code inputted in by the user.
    bool a = false;
        while (a==false){
        if ((userarrivalid != "HEA") && (userarrivalid != "EMA") && (userarrivalid != "ROM") && (userarrivalid != "DUB") && (userarrivalid != "BAR"))
        {
            cout << "You have entered an incorrect departure code.\nPlease Try Again...\n";
            cin >> userarrivalid;
        }
        else
        {
            a=true;
        }
    }

    int j = 1;
    bool resultsfound = false;
    cout << "\n";



    //RETURN THE RESULTS AND PUT THE RESULTS IN AN ARRAY - This little section places the searched results in a unique vector which then can be used later on in the program. 
    for (int i=0; i < flightDetails.size(); i++)
    {
        string tempflightdata = flightDetails[i];
        string departid = tempflightdata.substr(0,3);
        string arrivalid = tempflightdata.substr(4,3);
        if ((departid == userdepartid) && (arrivalid == userarrivalid))
        {
            cout << j << ":" << flightDetails[i] << "\n";
            flightSearch.push_back(flightDetails[i]);
            j++;
            needtoentercodes = false;
        }
        else
        {
            entry = "| Incorrect Entry. No direct connections! |\nPlease enter the ID code of the starting destination.\n";                 
        }
    }
}

}
4

1 回答 1

0

It's the old, old problem

    while (flightdata.good())
    {
        getline (flightdata, flightnextline);
        flightDetails.push_back(flightnextline);
    }
    flightdata.close();

should be

    while (getline (flightdata, flightnextline))
    {
        flightDetails.push_back(flightnextline);
    }
    flightdata.close();

Your while loop goes round one too many times because flightdata is still good() even after you've read the last line, and so you end up adding a blank line to your flightDetails vector. Later when you do tempflightdata.substr(4,3); on a blank line this causes the out_of_range error you see.

Caveat, I've only looked at the code, not debugged it.

于 2013-05-07T18:39:06.510 回答