控制台显示的内容:
START(0,0)
GOAL(0,2)
ooox
xxoo
ooox
我希望能够获得START和GOAL点的子字符串,不包括括号(仅包括坐标对)。我还想将它们存储为变量,因为我想添加验证,无论START或GOAL点是否超出网格范围。
我正在尝试制作一个遍历2D网格的应用程序,其中“ x”代表被阻止的路径,“ o”代表未被阻止的路径。
起点始终从网格的左下角开始,如下所示:
(0,2)(1,2)(2,2)(3,2)
(0,1)(1,1)(2,1)(3,1)
(0,0)(1,0)(2,0)(3,0)
我尝试将.substr()方法与我想存储值的起点和终点一起使用,但是在控制台中没有打印出任何内容。
void Grid::loadFromFile(const std::string& filename){
std::string line;
std::ifstream file(filename);
file.open(filename);
// Reads the file line by line and outputs each line
while(std::getline(file, line)) {
std::cout << line << std::endl;
}
std::string startPoint, goalPoint;
startPoint = line.substr(6,3);
std::cout << startPoint << std::endl;
file.close();
}
我希望std::cout << startPoint << std::endl;
将子字符串打印到控制台中,但是它只是读取文件并打印其中的任何内容,而没有其他内容。
答案 0 :(得分:1)
问题是您先读取文件的所有行,然后仅解析已读取的最后一行,要求起始索引超出范围。
您需要将解析移入阅读循环内:
void Grid::loadFromFile(const std::string& filename)
{
std::ifstream file(filename);
if (!file.is_open()) return;
std::string line, startPoint, goalPoint;
std::vector<std::string> grid;
while (std::getline(file, line))
{
if (line.compare(0, 5, "START") == 0)
startPoint = line.substr(6,3);
else if (line.compare(0, 4, "GOAL") == 0)
goalPoint = line.substr(5,3);
else
grid.push_back(line);
}
file.close();
std::cout << startPoint << std::endl;
std::cout << goalPoint << std::endl;
// process grid as needed...
}
或者,如果您知道前两行总是START
和GOAL
:
void Grid::loadFromFile(const std::string& filename)
{
std::ifstream file(filename);
if (!file.is_open()) return;
std::string line, startPoint, goalPoint;
std::vector<std::string> grid;
if (!std::getline(file, line)) return;
if (line.compare(0, 5, "START") != 0) return;
startPoint = line.substr(6,3);
if (!std::getline(file, line)) return;
if (line.compare(0, 4, "GOAL") != 0) return;
goalPoint = line.substr(5,3);
while (std::getline(file, line))
grid.push_back(line);
file.close();
std::cout << startPoint << std::endl;
std::cout << goalPoint << std::endl;
// process grid as needed...
}
答案 1 :(得分:0)
我相信getline只会将文件中的数据存储到for循环中文件每一行的字符串行中,直到到达null为止。
因此,在for循环行之后,基本上= null。
您需要读取文件的另一种方法或存储数据的方法,以便在for循环范围(也许是字符串数组)之外使用。
希望有帮助:)