尝试创建队列 - 崩溃C ++的问题

时间:2013-09-18 23:26:40

标签: c++ arrays queue

对于我的数据结构课程,我必须创建一个从.dat文件获取输入的队列,并根据高优先级(仅在它为1时)和低优先级(2 3 4或5)对其进行组织。必须有两个队列,*表示服务(或删除)的数量。 .dat文件如下所示:

R 3
T 5
W 1
A 4
* 3
M 5
B 1
E 1
F 2
C 4
H 2
J 1
* 4
* 1
D 3
L 1
G 5
* 9
=

这是main.cpp

int main ()
{
    arrayQueue myHigh; //creates object of arrayQueue 
    arrayQueue myLow; //creates another object of arrayQueue


    while(previousLine != "=") //gets all the lines of file, ends program when it gets the line "="
    {
        getline(datfile, StringToChar);  
        if (StringToChar != previousLine)
        {
            previousLine=StringToChar; //sets previousline equal to a string
            number = StringToChar[2]; //the number of the data is the third line in the string
            istringstream ( number ) >> number1; //converts the string to int
            character = StringToChar[0]; //the character is the first line in the string            

        }

        if (number1 == 1) //if number is 1, sends to high priority queue
        myHigh.addToQueue(number1);          
        else if (number1 == 2 || number1 == 3 || number1 == 4 || number1 == 5) //if number is 2 3 4 or 5 sends to low priority queue
        myLow.addToQueue(number1);

    }
    datfile.close();
    system ("pause");
}

这是数组类:

void arrayQueue::addToQueue(int x)
{
     if (full() == true)
     cout << "Error, queue full \n";
     else {
     fill = (fill+1)%maxSize;
     queueArray[fill] = x;
     cout << x << endl; //testing that number is actually being passed through
     count++;
     size++;
     }
}

然而,我得到的输出只是:

3
5

然后崩溃没有错误。

我不确定应该去哪里,我没有创建一个类的两个对象或者在C ++之前使用文件来读取数据。我做得对吗?我认为它只是将3和5送入高优先级队列,即使它不应该这样做。

3 个答案:

答案 0 :(得分:0)

由于输出通常是缓冲的,因此在程序崩溃之前可能无法看到所有输出。从我对你的代码的检查,我预计它会在到达输入文件的最后一行时崩溃,因为StringToChar的长度为1,你正在访问StringToChar [2]。好吧,也许不是崩溃,但肯定会得到垃圾。我不确定字符串是否会引发异常。

答案 1 :(得分:0)

您对读取线的处理肯定不太对。首先,您不检查是否可以成功读取一行,但在尝试读取后,应始终检查输入。此外,如果输入为=,您实际上将该值视为正常线。你的基本输入可能看起来像这样:

while (std::getline(datFile, StringToChar) && StringToChar != "=") {
    ...
}

鉴于你的“字符串”number实际上只包含一个字符,创建std::istringstream(创建这些对象相对昂贵)并解码{{1}有点过分。转换为char。此外,您实际上需要检查此操作是否成功(对于您的最后一行,例如,它失败)。

将表示数字的单个std::string转换为字符串可以使用以下内容完成:

char

答案 2 :(得分:0)

我认为“adipy”很接近,但是......

getline(datfile, StringToChar);

首先,您应检查返回值以确保返回字符串。

其次,如果我们假设StringToChar等于=,那么 (StringToChar != previousLine)true

然后StringToChar[2];,&lt;&lt;&lt;&lt;&lt;访问违规。数组只有两个字符。

此外,您可能尝试两次输入previousLine