Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++/QT-文件读取意外停止。其他一切都正常运转_C++_Qt_Gcc - Fatal编程技术网

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

C++ C++/QT-文件读取意外停止。其他一切都正常运转,c++,qt,gcc,C++,Qt,Gcc,我有一个很奇怪的问题。我有这个代码,应该循环到文件的末尾。但它只循环两次。它不会在一段时间内结束,但会到达“if”或“else”语句的末尾(取决于文件内容)。 其他一切都在“良好”运转,本应输入的数字也在输入,而且似乎一切都在运转,直到时间结束。 这是一个futoshiki游戏。代码应该读取每一行,将其视为字符串,然后将其分解为字符,这些字符又被转换为整数(一个字符除外,一个小于或大于号),这些字符构成单元格的位置或符号之间的位置。然后,它使用该数据向电路板添加新单元或在单元之间添加新符号。 文

我有一个很奇怪的问题。我有这个代码,应该循环到文件的末尾。但它只循环两次。它不会在一段时间内结束,但会到达“if”或“else”语句的末尾(取决于文件内容)。
其他一切都在“良好”运转,本应输入的数字也在输入,而且似乎一切都在运转,直到时间结束。 这是一个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;
}
int主窗口::图表点(字符字母)
{
整数=字母;
返回号码-48;
}
void主窗口::locateInBoard(字符串数据,棋盘游戏板)
{
if(data.size()==3){
整数=图表点(数据[2]);
对坐标(图点(数据[0]),图点(数据[1]);
gameboard.addCell(数字、真值、坐标);
}
否则{
配对第一坐标(ChartPoint(数据[0]),ChartPoint(数据[1]);
配对二次坐标(ChartPoint(数据[2])、ChartPoint(数据[3]);
gameboard.addSign(第一坐标、第二坐标、数据[4]);
}
}
void主窗口::getBoardFromFile(QString新闻字符串,board*pToBoard)
/*
每个板都有一个文件。文件名由文件大小决定
棋盘游戏,难度和棋盘数量。文本文件包含
董事会的标志和编号。假设数字3位于位置(2,1),那么
文件应包含一行“213”。对于标志,如果在(3,3)和(3,4)之间存在>,
文件应该有一行“3334>”
*/
{
QFile文件(newString);
如果(!file.open(QIODevice::ReadOnly | QIODevice::Text)){
返回;
}
文件中的QTextStream(&F);
QString line=in.readLine();
大小=line.toInt();
棋盘游戏棋盘(大小);
弦标准线;
而(!in.atEnd()){
line=in.readLine();
stdline=line.toStdString();
定位板内(标准线、游戏板);
}
*pToBoard=游戏板;
}
这是“董事会”的相关代码

board::board(int n)
{
boardSize=n;
gameboard=新单元格*[boardSize];

对于(int i=0;i请查看您的
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
<>这是可以工作的,但是你必须确保你的<代码>板//Cux>类正确地支持复制数据。如果你不写你自己的,C++会生成默认赋值操作符,但是它们对于任何琐碎的结构都不起作用。你可能需要改变代码,避免使用赋值或拷贝结构。或者

这里有一个快速的替代方法,可以避免您需要找出如何编写自己的
操作符=

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;
}

(如果您不想支持复制构造函数和
运算符=
,最好还是编写自己的构造函数-只需让它们不做任何事情,并在标题中将它们标记为private。这将允许编译器帮助您捕获意外复制。)

该文件是否有可能嵌入了Ctrl-Z?这会导致Windows下文本模式下的文件过早结束。不,没有可能。我正在运行Linux,并且在第二次迭代中使用了多个不同的文件。我会将其添加到原始帖子中。我检查了它们以防万一……不确定如何做,但我在nano中打开了它们还有几位编辑?什么也没看到。我想已经试过了,在每行前面加上从中提取的文件名,然后将
stdline
输出到
std::cerr
(或者不相关;sry,不是Qt程序员,所以我在这里得到了一些东西)。看到实际的文件内容可能会很有帮助。再加上临时注释调用
locateInBoard
,看看循环是否能很好地完成文件的结尾可能会被证明是有教育意义的。看起来你是在通过值而不是指针或参考来传递游戏板到locateInBoard。A另外,我有点怀疑
*ptToBoard=gameboard
--你的Board类有正确的复制语义来实现这一点吗?AlexP,你两个都是对的。我需要引用它,它现在正在工作。如果你想回答问题,而不是评论,这样我就可以把它选为最佳答案。(我认为它是这样工作的?对不起,第一次来这里)。非常感谢,真的!遗憾的是,现在还没有到最后一刻
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;
}