繁体   English   中英

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

[英]Attempting to create a queue - issue with crashing C++

对于我的数据结构课程,我必须创建一个队列,该队列从.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送入高优先级队列,即使不应该这样做。

由于通常对输出进行缓冲,因此在程序崩溃之前,您可能看不到所有输出。 通过检查您的代码,我希望它到达输入文件的最后一行时会崩溃,因为StringToChar的长度为1,并且您正在访问StringToChar [2]。 好吧,也许不会崩溃,但是肯定会产生垃圾。 我不确定string是否会引发异常。

您对读取行的处理肯定不是很正确。 首先,您不会检查是否可以成功读取行,但是尝试读取行之后应始终检查输入。 同样,如果输入为= ,则您实际上会将值视为正常行。 您的基本输入应该看起来像这样:

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

假设您的“字符串” number实际上只包含一个字符,那么创建一个std::istringstream (创建这些对象相对昂贵)并对一个转换为std::stringchar进行解码就有点过头了。 另外,您实际上需要检查此操作是否成功(例如,对于您的最后一行,它失败了)。

可以使用以下方法将表示数字的单个char转换为字符串:

if (3 <= StringToChar.size()
    && std::isdigit(static_cast<unsigned char>(StringToChar[2])) {
    number1 = StringToChar[2] - '0';
}
else {
    std::cout << "the string '" << StringToChar << "' doesn't have a digit at position 2\n";
    continue;
}

我认为“ adipy”已经接近,但...

getline(datfile, StringToChar);

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

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

然后StringToChar[2]; ,<<<<<访问冲突。 数组只有两个字符长。

另外,您可能试图输入最后一个previousLine一行两次。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM