我正在为《康威的人生游戏》的.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之后-详细信息请参阅他的回答