我的程序是从文件打印信息队列,但是我的以下代码有问题。当我运行程序时,保持循环。我不知道问题所在。有什么帮助吗?

#include <iostream>
#include <fstream>
#include <string>
#include <iomanip>
#include <queue>
#include <list>
using namespace std;

void simulation(ifstream &infile);
void processArrival(int *newEvent, ifstream &inFile, list<int> eventList,queue<int> printQueue);
void processDeparture(int *newEvent, list<int> eventList,queue<int> printQueue);
    string name[100];
    int timeAccepted[100];
    int fileSize[100];
    int i = 1;
    int j = 1;

int currentTime;
bool checker = true;
int main(void)
{

    ifstream inFile;
    string fileName;

    int i = 0;
    inFile.open("123.txt", ios::in);

    simulation(inFile);
    /*while(inFile.peek() != EOF )

    {
        inFile>>name[i]>>timeAccepted[i]>>fileSize[i];
        i++;
    }

    for(int s = 0; s < i; s++)
    {
        cout << name[s] << timeAccepted[s] <<  fileSize[s] <<endl;
    }*/
    return 0;
}


void simulation(ifstream &inFile)
{
    queue<int> printQueue;
    list<int> eventList;

    int *newEvent;
    while(inFile.peek() != '\n')
    {
        inFile>>name[0]>>timeAccepted[0]>>fileSize[0];



    }



    eventList.push_front(timeAccepted[0]);
    int checkEmpty = eventList.empty();
    newEvent = &eventList.front();
    while(checkEmpty ==0)
    {

         newEvent = &eventList.front();


        if(checker)
        {
            processArrival(newEvent, inFile, eventList, printQueue);

        }

        else
        {
            processDeparture(newEvent, eventList, printQueue);

        }
        checkEmpty = eventList.empty();
    }


}

void processArrival(int *newEvent, ifstream &inFile, list<int> eventList,queue<int> printQueue)
{
    int atFront=0;
    atFront = printQueue.empty();
    cout << atFront <<endl;
    printQueue.push(*newEvent);
    cout << printQueue.front() <<endl;
    eventList.remove(*newEvent);

    int temp;

    if(atFront==1)
    {
        currentTime = *newEvent + fileSize[0];
        cout << name[0] << " @@ " << *newEvent << " @@ " << currentTime << endl;
        eventList.push_back(currentTime);



    }
    checker = false;
    if(inFile.peek() != EOF )
    {

        inFile>>name[i]>>timeAccepted[i]>>fileSize[i];

        eventList.push_back( timeAccepted[i] );
        i++;

        checker = false;
        if(eventList.back() <= eventList.front())
        {
            temp = eventList.back();
            eventList.back() = eventList.front();
            eventList.front() = temp;
            checker = true;
        }
    }





}

void processDeparture(int *newEvent, list<int> eventList,queue<int> printQueue)
{
    printQueue.pop();
    eventList.pop_front();
    int checkEmpty = 1;
    checkEmpty = printQueue.empty();
    int temp;
    if(checkEmpty ==0)
    {
        currentTime = *newEvent + fileSize[j];
        cout << name[j] << " " << *newEvent << " " << currentTime << endl;
        eventList.push_back(currentTime);
        checker = true;
        if(eventList.back() < eventList.front())
        {
            temp = eventList.back();
            eventList.back() = eventList.front();
            eventList.front() = temp;
            checker = false;
        }
        j++;
    }

}

最佳答案

您的processArrivalprocessDeparture函数按值获取它们的eventListprintQueue参数。这意味着当您调用它们时,例如在此行中:

processArrival(newEvent, inFile, eventList, printQueue);


复制eventListprintQueue并将其传递到processArrival函数中。然后,processArrival函数将在这些副本上进行操作,并且永远不会修改原始数据。特别是,这意味着原始的eventList永远不会删除任何项目,因此它永远不会为空-它将不断尝试反复处理第一个事件。

解决方案是通过引用传递这些参数。即将processArrival的定义更改为

void processArrival(int *newEvent, ifstream &inFile, list<int>& eventList, queue<int>& printQueue)


请注意我在&eventList之前插入的printQueue字符。这些导致对原始数据的引用,而不是原始数据的副本,被传递到processArival函数中。这意味着processArrival将按您希望的那样直接对原始数据进行操作。不要忘记对processDeparture进行相应的更改。

09-06 20:01