C ++ / QT - 文件读取意外停止。其他一切都正常运作

时间:2014-02-27 05:52:17

标签: c++ qt gcc

我有一个非常奇怪的问题。我有这个代码,它应该循环到文件的末尾。但它只会循环两次。它永远不会完成,但它会到达"如果"或"否则"句子(取决于文件内容)。
其他一切正在发挥作用"好的",应该进入的数字正在进入,一切似乎都在起作用,直到它没有达到结束的程度。 这是一个futoshiki游戏。代码应该读取每一行,将其视为一个字符串,然后将其分解为字符,而字符又被转换为整数(除了一个字符,小于或大于符号),这使得向上的细胞位置或标志之间的位置。然后它使用该数据向板添加新单元或在单元之间添加新符号 文件的第一行是电路板的大小 这个问题发生在几个不同大小的不同文件中,总是在第二次迭代中。如果它有所不同,我会顺便运行Linux。

int MainWindow::charToInt(char letter)
{
    int number = letter;
    return number - 48;
}

void MainWindow::locateInBoard(string data, board gameboard)
{
    if (data.size()==3){
        int number = charToInt(data[2]);
        pair<int,int> coordinate(charToInt(data[0]), charToInt(data[1]));
        gameboard.addCell(number,true,coordinate);
    }
    else{
        pair<int,int> firstCoordinate(charToInt(data[0]), charToInt(data[1]));
        pair<int,int> secondCoordinate(charToInt(data[2]), charToInt(data[3]));
        gameboard.addSign(firstCoordinate, secondCoordinate, data[4]);
    }
}

void MainWindow::getBoardFromFile(QString newString, board* ptToBoard)
/*
    Each board has a file. The name of the file is determined by the size of the
    board to play, the difficulty and the number of board. The text file contains the
    sign and numbers of the board. Let's say the number 3 is in position (2,1), then the
    file should contain a line "213". For signs, if there is a > between (3,3) and (3,4),
    the file should have a line "3334>"
*/
{
    QFile file(newString);
    if (!file.open(QIODevice::ReadOnly | QIODevice::Text)){
        return;
    }
    QTextStream in(&file);
    QString line = in.readLine();
    size = line.toInt();
    board gameboard(size);
    string stdline;
    while (!in.atEnd()) {
        line = in.readLine();
        stdline = line.toStdString();
        locateInBoard(stdline,gameboard);
    }
    *ptToBoard = gameboard;
}

这是&#34; board&#34;的相关代码。

board::board(int n)
{
    boardSize = n;
    gameboard = new cell*[boardSize];
    for (int i = 0; i<boardSize; i++){
        gameboard [i] = new cell[boardSize];
    }
    pair<int,int> newPosition;
    for (int i = 0; i<boardSize; i++){
        newPosition.first = i;
        for (int j = 0; j<boardSize; j++){
            newPosition.second = j;
            gameboard[i][j].setPosition(newPosition);
        }
    }
}

void board::addCell(int number, bool fixed, pair<int,int> position)
{
    cell newCell(number,fixed,position);
    gameboard[position.first][position.second] = newCell;
}

void board::addSign(pair<int,int> firstPosition, pair<int,int> secondPosition, char sign)
{
    cell firstCell = gameboard[firstPosition.first][firstPosition.second];
    cell secondCell = gameboard[secondPosition.first][secondPosition.second];
    gameRules.setUnequality(firstCell,secondCell,sign);
}

我知道它并不漂亮,但我应该在星期三递上这个,而且星期四凌晨三点,我真的不在乎它是否真的很漂亮只要它正在工作,就会硬编码。

非常感谢你的帮助,我真的非常绝望。

1 个答案:

答案 0 :(得分:1)

查看locateInBoard方法的签名:

void MainWindow::locateInBoard(string data, board gameboard)

通过值传递电路板。因此,对locateInBoard中的电路板所做的所有更改都将应用于本地副本,当函数完成时,该副本将被丢弃。

尝试传递引用:

void MainWindow::locateInBoard(string data, board & gameboard)

另外,我很担心这个:

board gameboard(size); // created locally
// ... lots of processing ...
*ptToBoard = gameboard; // copy using assignment operator

这是可以工作的东西,但您必须确保您的board类正确支持复制数据。如果你不编写自己的C ++,C ++会生成默认的赋值运算符,但它们不适用于除了普通结构之外的任何东西。您可能需要implement your own assignment operator或更改代码以避免使用赋值或复制构造函数。

这是一个快速的替代方案,可以避免需要弄清楚如何编写自己的operator=

board * MainWindow::getBoardFromFile(QString newString)
{
    // ...
    board * gameboard = new board(size);
    // ... do all of your stuff ...
    // you'll need to change your existing code to use -> instead of .
    // if you get an error, return 0 or throw an exception
    return gameboard;
}

(如果你不想支持复制构造函数和operator=,那么最好自己编写一个 - 只是让它们什么也不做,并在标题中标记它们。这将允许编译器帮助你抓到了意想不到的复制品。)