函数不会从向量输出任何内容C++

function doesn't output anything from the vectors C++

本文关键字:任何内 C++ 输出 向量 函数      更新时间:2023-10-16

基本上,我正在做一些课程,这需要我创建一个最多允许两站的航班预订系统,例如伦敦到巴黎到巴塞罗那到汉堡。我设法创建了一个一站式工作的版本,例如从伦敦到巴黎再到巴塞罗那,但我无法让这个版本工作。我在下面包含了我的代码,每当我调用这个函数并将其传递给任何两个机场时,它都不会输出任何内容。我很感激下面的代码很长,但其中很多都是重复的。我可能也以完全错误的方式对这个问题进行了编程。如果你对如何处理这个问题有什么更好的想法,请分享。

非常感谢。

void searchAllFlights(string origin, string destination)
    {
        ifstream checkNumOfLines("flights.txt");
        int numOfLines = 0;
        for(string line; getline(checkNumOfLines, line);){
            numOfLines++;
        }
        int lengthOfLines[10] = {0,0,0,0,0,0,0,0,0,0};
        checkNumOfLines.clear();
        checkNumOfLines.seekg(0, ios::beg);
        int index = 0;
        for(string line; getline(checkNumOfLines, line);){
            lengthOfLines[index] = line.length();
            index++;
        }
        int filePointers[11] = {0, lengthOfLines[0], lengthOfLines[0] + lengthOfLines[1], lengthOfLines[0] + lengthOfLines[1] + lengthOfLines[2],
            lengthOfLines[0] + lengthOfLines[1] + lengthOfLines[2] + lengthOfLines[3], lengthOfLines[0] + lengthOfLines[1] + lengthOfLines[2] +
            lengthOfLines[3] + lengthOfLines[4], lengthOfLines[0] + lengthOfLines[1] + lengthOfLines[2] +
            lengthOfLines[3] + lengthOfLines[4] + lengthOfLines[5], lengthOfLines[0] + lengthOfLines[1] + lengthOfLines[2] +
            lengthOfLines[3] + lengthOfLines[4] + lengthOfLines[5] + lengthOfLines[6], lengthOfLines[0] + lengthOfLines[1] + lengthOfLines[2] +
            lengthOfLines[3] + lengthOfLines[4] + lengthOfLines[5] + lengthOfLines[6] + lengthOfLines[7], lengthOfLines[0] + lengthOfLines[1] 
        + lengthOfLines[2] + lengthOfLines[3] + lengthOfLines[4] + lengthOfLines[5] + lengthOfLines[6] + lengthOfLines[7] + lengthOfLines[8], 
        lengthOfLines[0] + lengthOfLines[1] + lengthOfLines[2] + lengthOfLines[3] + lengthOfLines[4] + lengthOfLines[5] + lengthOfLines[6] + 
        lengthOfLines[7] + lengthOfLines[8] + lengthOfLines[9]};
        ifstream flights("flights.txt");
        startingDeparturePoint = origin;
        endDestinationPoint = destination;
        totalFlightsPrice = 0;
        totalFlightDuration = 0;
        string originFromFile;
        string destFromFile;
        string airline;
        int price;;
        int flightDuration;
        cout << "No. |" << "Origin |" << "Destination |" << "Airline             |" << "Price         |" << "Duration                 |" << endl;
        cout << "----------------------------------------------------------------------------------------" << endl;
        matches = 0;
        int currentLine = 0;
        while(flights >> originFromFile >> destFromFile >> airline >> price >> flightDuration)
        {
            //flights.seekg(setfilepos, ios::beg);
            int numberOfChars = originFromFile.length() + destFromFile.length() + airline.length();

            if(originFromFile == startingDeparturePoint && destFromFile == endDestinationPoint)
            {
                matches++;
                directFlight(originFromFile, destFromFile, airline, price, flightDuration);
            }
            else if(originFromFile != startingDeparturePoint && destFromFile == endDestinationPoint)
            {
                matches++;
                string stopoverLast = originFromFile;
                string airlineLast = airline;
                int priceLast = price;
                int flightDurationLast = flightDuration;
                int currentIndex = firstOrigins.size() + 1;
                secondOrigins[currentIndex] = stopoverLast;
                secondDests[currentIndex] = destFromFile;
                secondAirlines[currentIndex] = airlineLast;
                secondPrices[currentIndex] = priceLast;
                secondFlightDurations[currentIndex] = flightDurationLast;

                ifstream flights2("flights.txt");
                string originFromFile2;
                string destFromFile2;
                string airlineFromFile2;
                int priceFromFile2;
                int flightDurationFromFile2;
                while(flights2 >> originFromFile2 >> destFromFile2 >> airlineFromFile2 >> priceFromFile2 >> flightDurationFromFile2){//1q
                    if(destFromFile2 == stopoverLast){
                        firstOrigins.push_back(originFromFile2);
                        firstDests.push_back(destFromFile2);
                        firstAirlines.push_back(airlineFromFile2);
                        firstPrices.push_back(priceFromFile2);
                        firstFlightDurations.push_back(flightDurationFromFile2);
                        if(originFromFile2 != startingDeparturePoint){
                            thirdOrigins[currentIndex] = secondOrigins[currentIndex];
                            thirdDests[currentIndex] = secondOrigins[currentIndex];
                            thirdAirlines[currentIndex] = secondOrigins[currentIndex];
                            thirdPrices[currentIndex] = secondPrices[currentIndex];
                            thirdFlightDurations[currentIndex] = secondFlightDurations[currentIndex];
                            secondOrigins[currentIndex] = firstOrigins[currentIndex];
                            secondDests[currentIndex] = firstOrigins[currentIndex];
                            secondAirlines[currentIndex] = firstOrigins[currentIndex];
                            secondPrices[currentIndex] = firstPrices[currentIndex];
                            secondFlightDurations[currentIndex] = firstFlightDurations[currentIndex];
                            ifstream flights3("flights.txt");
                            string originFromFile3;
                            string destFromFile3;
                            string airlineFromFile3;
                            int priceFromFile3;
                            int flightDurationFromFile3;
                            while(flights3 >> originFromFile3 >> destFromFile3 >> airlineFromFile3 >> priceFromFile3 >> flightDurationFromFile3){
                                if(originFromFile3 == startingDeparturePoint && destFromFile3 == secondOrigins[currentIndex]){
                                    firstOrigins[currentIndex] = originFromFile3;
                                    firstDests[currentIndex] = destFromFile3;
                                    firstAirlines[currentIndex] = airlineFromFile3;
                                    firstPrices[currentIndex] = priceFromFile3;
                                    firstFlightDurations[currentIndex] = flightDurationFromFile3;
                                    while(flights3 >> originFromFile3 >> destFromFile3 >> airlineFromFile3 >> priceFromFile3 >> flightDurationFromFile3){
                                        if(originFromFile3 == startingDeparturePoint && destFromFile3 == secondOrigins[currentIndex]){
                                            firstOrigins.push_back(firstOrigins[currentIndex]);
                                            firstDests.push_back(firstDests[currentIndex]);
                                            firstAirlines.push_back(firstAirlines[currentIndex]);
                                            firstPrices.push_back(firstPrices[currentIndex]);
                                            firstFlightDurations.push_back(firstFlightDurations[currentIndex]);
                                            secondOrigins[currentIndex + 1] = secondOrigins[currentIndex];
                                            secondDests[currentIndex + 1] = secondDests[currentIndex];
                                            secondAirlines[currentIndex + 1] = secondAirlines[currentIndex];
                                            secondPrices[currentIndex + 1] = secondPrices[currentIndex];
                                            secondFlightDurations[currentIndex + 1] = secondFlightDurations[currentIndex];
                                            thirdOrigins[currentIndex + 1] = originFromFile3;
                                            thirdDests[currentIndex + 1] = destFromFile3;
                                            thirdAirlines[currentIndex + 1] = airlineFromFile3;
                                            thirdPrices[currentIndex + 1] = priceFromFile3;
                                            thirdFlightDurations[currentIndex + 1] = flightDurationFromFile3;
                                        }
                                    }
                                }
                            }
                        }
                        else{
                            currentIndex++;
                            while(flights >> originFromFile >> destFromFile >> airline >> price >> flightDuration){
                                if(originFromFile != startingDeparturePoint && destFromFile == endDestinationPoint){
                                    matches++;
                                    stopoverLast = originFromFile;
                                    airlineLast = airline;
                                    priceLast = price;
                                    flightDurationLast = flightDuration;
                                    secondOrigins[currentIndex] = stopoverLast;
                                    secondDests[currentIndex] = destFromFile;
                                    secondAirlines[currentIndex] = airlineLast;
                                    secondPrices[currentIndex] = priceLast;
                                    secondFlightDurations[currentIndex] = flightDurationLast;
                                    firstOrigins.push_back(originFromFile2);
                                    firstDests.push_back(destFromFile2);
                                    firstAirlines.push_back(airlineFromFile2);
                                    firstPrices.push_back(priceFromFile2);
                                    firstFlightDurations.push_back(flightDurationFromFile2);
                                    while(flights2 >> originFromFile2 >> destFromFile2 >> airlineFromFile2 >> priceFromFile2 >> flightDurationFromFile2){
                                        currentIndex++;
                                        secondOrigins[currentIndex] = stopoverLast;
                                        secondDests[currentIndex] = destFromFile;
                                        secondAirlines[currentIndex] = airlineLast;
                                        secondPrices[currentIndex] = priceLast;
                                        secondFlightDurations[currentIndex] = flightDurationLast;
                                        firstOrigins.push_back(originFromFile2);
                                        firstDests.push_back(destFromFile2);
                                        firstAirlines.push_back(airlineFromFile2);
                                        firstPrices.push_back(priceFromFile2);
                                        firstFlightDurations.push_back(flightDurationFromFile2);
                                    }
                                }
                            }
                        }
                    }
                }
            }
            break;
        }
        // loop over vectors and print out results, put in conditional statements to
        //check if 2nd and 3rd flights exist, if they do add the "-----" after
        for(int i = 0; i < firstOrigins.size(); i++){
            int mins = firstFlightDurations[i];
            int hours = 0;
            while(mins >= 60){
                hours++;
                mins -= 60;
            }
                cout << "No. |" << "Origin |" << "Destination |" << "Airline             |" << "Price         |" 
                    << "Duration " << endl;
            if(firstOrigins[i] != "-"){
                cout << left << setw(4) << setfill(' ') << 1 << right << "|";
                cout << left << setw(7) << setfill(' ') << firstOrigins[i] << right << "|";
                cout << left << setw(12) << setfill(' ') << firstDests[i] << right << "|";
                cout << left << setw(20) << setfill(' ') << firstAirlines[i] << right << "|";
                cout << left << "x9c" << setw(13) << setfill(' ') << left << firstPrices[i] << right << "|";
                cout << left << hours << "hr(s) " << mins << "min(s)" << setw(11) << setfill(' ') << right << "|" << endl;
                if(secondOrigins[i] != "-"){
                    int mins2 = secondFlightDurations[i];
                    int hours2 = 0;
                    while(mins2 >= 60){
                        hours2++;
                        mins2 -= 60;
                    }
                    totalFlightsPrice = firstPrices[i] + secondPrices[i];
                    totalFlightDuration = firstFlightDurations[i] + secondFlightDurations[i] + thirdFlightDurations[i];
                    cout << left << setw(4) << setfill(' ') << 1 << right << "|";
                    cout << left << setw(7) << setfill(' ') << secondOrigins[i] << right << "|";
                    cout << left << setw(12) << setfill(' ') << secondDests[i] << right << "|";
                    cout << left << setw(20) << setfill(' ') << secondAirlines[i] << right << "|";
                    cout << left << "x9c" << setw(13) << setfill(' ') << left << secondPrices[i] << right << "|";
                    cout << left << hours2 << "hr(s) " << mins2 << "min(s)" << setw(11) << setfill(' ') << right << "|" << endl;
                    if(thirdOrigins[i] != "-"){
                        int mins3 = secondFlightDurations[i];
                        int hours3 = 0;
                        while(mins3 >= 60){
                            hours3++;
                            mins3 -= 60;
                        }
                        totalFlightsPrice = firstPrices[i] + secondPrices[i] + thirdPrices[i];
                        totalFlightDuration = firstFlightDurations[i] + secondFlightDurations[i] + thirdFlightDurations[i];
                        cout << left << setw(4) << setfill(' ') << 1 << right << "|";
                        cout << left << setw(7) << setfill(' ') << thirdOrigins[i] << right << "|";
                        cout << left << setw(12) << setfill(' ') << thirdDests[i] << right << "|";
                        cout << left << setw(20) << setfill(' ') << thirdAirlines[i] << right << "|";
                        cout << left << "x9c" << setw(13) << setfill(' ') << left << thirdPrices[i] << right << "|";
                        cout << left << hours3 << "hr(s) " << mins3 << "min(s)" << setw(11) << setfill(' ') << right << "|" << endl;
                        int totalmins = totalFlightsPrice;
                        int totalhours = 0;
                        while(totalmins >= 60){
                            totalhours++;
                            totalmins -= 60;
                        }
                        cout << left << setw(4) << setfill(' ') << " " << right << "|";
                        cout << left << setw(7) << setfill(' ') << " " << right << "|";
                        cout << left << setw(12) << setfill(' ') << " " << right << "|";
                        cout << left << setw(20) << setfill(' ') << " " << right << "|";
                        cout << left << setw(13) << setfill(' ') << "Total = x9c" << totalFlightsPrice << right << "|";
                        cout << left << setw(6) << setfill(' ') << totalhours << "hr(s) " << totalmins << "min(s)"
                            << setw(11) << setfill(' ') << right << "|" << endl;
                        cout << "----------------------------------------------------------------------------------------" << endl;
                    }
                    else{
                        int totalmins = totalFlightDuration;
                        int totalhours = 0;
                        while(totalmins >= 60){
                            totalhours++;
                            totalmins -= 60;
                        }
                        cout << left << setw(4) << setfill(' ') << " " << right << "|";
                        cout << left << setw(7) << setfill(' ') << " " << right << "|";
                        cout << left << setw(12) << setfill(' ') << " " << right << "|";
                        cout << left << setw(20) << setfill(' ') << " " << right << "|";
                        cout << left << setw(13) << setfill(' ') << "Total = x9c" << totalFlightsPrice << right << "|";
                        cout << left << setw(6) << setfill(' ') << totalhours << "hr(s) " << totalmins << "min(s)"
                            << setw(11) << setfill(' ') << right << "|" << endl;
                        cout << "----------------------------------------------------------------------------------------" << endl;
                    }
                }
                else{
                    cout << "----------------------------------------------------------------------------------------" << endl;
                }
            }
            else{
                cout << "No possible flight paths between the airports inputted.";
            }
            currentLine++;
            if(filePointers[currentLine] != filePointers[currentLine - 1]){
                flights.clear();
                flights.seekg(filePointers[currentLine],ios::beg);
            }
        }

编辑:您也可以忽略checkNumOfLines文件以及filePointers和lengthOfLines数组。我想我必须重置文件指针才能正确打印出来,但没有。刚刚意识到,它确实输出了一个可能的飞行路径,即如果我将我正在读取的飞行路径中的第一个起点和终点输入到程序中。

编辑2:这给了我太多的压力。我觉得我用的这个方法太荒谬了。有人能简要介绍一下他们将采取的方法来构建一个命令行程序吗?该程序将向您显示两个用户输入的机场代码之间可能的航班列表,最多允许2站。

新方法(感谢@PaulMcKenzie和@TonyD):

我基本上创建了三个向量,一个用于保存文本文件中所有可能的航班,一个保存当前旅程的航班(在每个循环中都会清除),另一个是多维向量,用于将一系列航班保存为当前旅程中的向量。

class flightSearch
{
public:
    struct Flight
    {
        string origin;
        string destination;
        string airline;
        int price;
        int flightDuration;
    };
    vector<Flight> allFlights;
    vector<Flight> flightsInJourney;
    vector<vector <Flight> > allMatches; 
    Flight f;
    void populateFlightsVector()
    {
        ifstream flightsfile("flights.txt");
        while(flightsfile >> f.origin >> f.destination >> f.airline >> f.price >> f.flightDuration){
            allFlights.push_back(f);
        }
    }
    void searchForARoute(string userOrigin, string userDestination)
    {
        populateFlightsVector();
        for(unsigned i = 0; i < allFlights.size(); i++)
        {
            flightsInJourney.clear();
            if(allFlights[i].origin == userOrigin && allFlights[i].destination == userDestination)
            {
                flightsInJourney.insert(flightsInJourney.begin(), allFlights[i]);
            }
            allMatches.push_back(flightsInJourney);
        }
        for(unsigned i = 0; i < allMatches.size(); i++)
        {
            for(unsigned j = 0; j < allMatches[i].size(); j++){
                cout << allMatches[i][j].origin << " " << allMatches[i][j].destination << " " << allMatches[i][j].airline << endl;
            }
        }
    }
};  

现在,我应该能够像第一次尝试那样添加一些代码来检查需要多个航班的路线,并将它们添加到最终多维向量中。我已经测试了这个代码,到目前为止,它似乎适用于直航。随意指出任何看起来可能有问题的东西。

对于您的最新代码,以下是我看到的会导致一些问题的问题。

首先,不需要将flightsInJourney向量作为全局变量,因此不需要在searchForARoute函数中重复清除该向量。您可以将其设置为searchForARoute函数的本地,因为您所使用的只是收集所有匹配的航班,然后将这些航班复制到allMatches向量中。

其次,您在搜索函数中调用populateFlightsVector,但这不是必需的。您应该只填充一次数据文件,而不是重复填充。最好把它放在main()或类似的函数中,该函数只被调用一次来设置数据。

第三,返回searchForARoute函数,您收集发现不正确的航班的循环。您应该首先收集在本地向量中找到的所有航班,然后在完成后,将找到的航班的向量push_back添加到您的allMatches向量中。

简而言之,这个函数可能看起来更像这样:

    void searchForARoute(const string& userOrigin, 
                         const string& userDestination)
    {
        vector<Flight> flightsInJourney;
        for(size_t i = 0; i < allFlights.size(); i++)
        {
            if(allFlights[i].origin == userOrigin && allFlights[i].destination == userDestination)
                flightsInJourney.push_back(allFlights[i]);
        }
        // push back all of the found matches
        allMatches.push_back(flightsInJourney);
        for(size_t i = 0; i < allMatches.size(); i++)
        {
            for(size_t j = 0; j < allMatches[i].size(); j++)
                cout << allMatches[i][j].origin << " " << allMatches[i] [j].destination << " " << allMatches[i][j].airline << endl;
        }
     }