gpt4 book ai didi

c++ - 在 C++ 中进行文件解析时跳到特定的行值

转载 作者:行者123 更新时间:2023-11-28 06:24:06 25 4
gpt4 key购买 nike

我正在为康威的生命游戏编写 .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" 未找到,则条件为真。那将是文件的第一行,所以这就是所有循环读取的内容。只需将运算符切换为 !=:

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

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

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

为此:

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

关于c++ - 在 C++ 中进行文件解析时跳到特定的行值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28817361/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com