在c++中进行文件分析时,请跳到特定的行值



我正在为《康威的人生游戏》的.lif 105编写一个文件解析器。它工作得很好,只是我想跳过#N上面的文本段,它标志着注释的结束。但出于某种原因,这只是跳过了前三行。

这里有一个例子:

#Life 1.05
#D Name: 1 beacon
#D Approximately the 32nd-most common oscillator.
#D www.conwaylife.com/wiki/index.php?title=1_beacon
#N
#P 10 10
..**
.*.*
*..*.**
**.*..*
.*.*
.*..*
..**

它将跳过行:

#Life 1.05
#D Name: 1 beacon
#D Approximately the 32nd-most common oscillator.

结果是细胞段开始时比它应该的低3个y线。

#include "fileparser.h"
#include <QCoreApplication>
#include <fstream>
#include <string>
#include <sstream>
using namespace std;
string filetype = "#Life 1.05";
void getGame(bool array[100][100], const string& fname){
    // create some objects in memory
    ifstream infile("C:/GameOfLife/ellisonp4hwemulator_105.lif");
    string testType, line;
    int xPos= 0, yPos= 0, temp;
    // read objects
    bool comments = true;
    while (std::getline(infile, line) && comments)
    {
        if(line.find("#N") == std::string::npos)
            comments = false;
    }
    std::getline(infile, line);
    std::istringstream iss(line);

    while(std::getline(infile, line)){
        std::istringstream iss(line);
        iss >> line;
        temp = xPos;
        for(char c : line){
            if(c == '*')
                array[temp][yPos] = true;
            temp++;
        }
        yPos++;
    }
    infile.close(); // optional
}

对于那些愿意帮助更多人的人来说,这是一个额外的问题!最初我想用#P来标记单元格的起始单词。因此,在这种情况下,它将从X-10 Y-10开始绘制。

但是找不到它。如果你想帮助一些额外的人,下面是它的代码:)

#include "fileparser.h"
#include <QCoreApplication>
#include <fstream>
#include <string>
#include <sstream>
using namespace std;
string filetype = "#Life 1.05";
void getGame(bool array[100][100], const string& fname){
    // create some objects in memory
    ifstream infile("C:/GameOfLife/ellisonp4hwemulator_105.lif");
    string testType, line, emptyValue;
    int xPos, yPos, temp;
    // read objects
    bool comments = true;
    while (std::getline(infile, line) && comments)
    {
        if(line.find("#N") == std::string::npos)
            comments = false;
    }
    std::getline(infile, line);
    std::istringstream iss(line);
    iss >> emptyValue >> xPos >> yPos;

    while(std::getline(infile, line)){
        std::istringstream iss(line);
        iss >> line;
        temp = xPos;
        for(char c : line){
            if(c == '*')
                array[temp][yPos] = true;
            temp++;
        }
        yPos++;
    }
    infile.close(); // optional
}

我想要iss>>emptyValue>>xPos>>yPos;

捕获值emptyValue=#p,xPos=10,yPos=10

感谢您花时间阅读我的长篇问题:)

if(line.find("#N") == std::string::npos)
    comments = false;

这与你想要的正好相反。如果"#N"而未找到,则条件为true。这将是文件的第一行,所以这就是所有的循环读取。只需将操作员切换到!=:

if(line.find("#N") != std::string::npos)
    comments = false;

事实上,循环也会读下一行,我认为这不是你想要的。你可以通过在while循环中切换条件检查的顺序来解决这个问题:

while (std::getline(infile, line) && comments)

到此:

while (comments && std::getline(infile, line))

在您提供的第一个函数中,这行

if(line.find("#N") == std::string::npos)

应该是

if(!(line.find("#N") == std::string::npos))

你希望它在找到这个片段后将注释设置为false,而不是在没有找到的情况下

编辑:

while循环中的条件也需要交换。我刚刚发现了这一点,不幸的是,在Benjamin Lindley之后-详细信息请参阅他的回答

相关内容

  • 没有找到相关文章

最新更新