我目前正在使用c ++。我的目标是能够通过我计划能够存储的一系列步骤来实现A *算法,并列出从A点到B点的最短路径。
我的程序将接受一个命令行参数,该参数将是一个要读入的文件。给程序一个文件读入的目的是每个文件都是它自己的" grid"用于A *处理。网格文件的格式如下:
Num 1 = WIDTH,然后Num 2 = HEIGHT
o =开始
* =完成
。 =可通过的节点
#=无法通行的墙
这是一个示例网格,让我们称之为" Grid1",将是:
8 5
o......#
......##
.....###
....####
.......*
所以要处理这个,当你运行程序时,你会传入" Grid1"。 从这里开始,我计划创建一个文件流,并将每个角色读入2D阵列/矢量,以尝试重新创建网格,这样我就可以拥有位置。例如,在" Grid1"角色" o"将在阵列/矢量中的位置[0] [0]。我的尝试实施如下:
#include <iostream>
#include <fstream>
#include <vector>
#include <unordered_map>
using namespace std;
int main(int argc, char *argv[])
{
//Checking for CLA
if( argc < 1 )
{
cout << "Program must take atleast <1> arguments!" << endl << "1) File to read 2) OPTIONAL: Type of search" << endl;
}
//CLA #1 is the file containing GRID to be read in
string gridTBO = argv[1];
//Start new filestream and open grid file for reading
ofstream gridFile;
gridFile.open( gridTBO );
//Check to make sure we can even open the file before proceeding
if( gridFile.is_open() )
{
//To store grid data
vector<string> grid;
grid[0][0].push_back("Hello");
cout << grid[0][0];
}
但是,关于我的&#34; push_back&#34;,似乎我无法打印出来或将数据丢入向量中。我主要希望每个索引如[0] [0] [0] [1] [0] [2]保存每个单独的字符,以便重新创建一个像我传入的网格。
我不太确定我做错了什么,因为我使用向量相当缺乏经验,但是,将数据推入网格的代码纯粹是出于测试目的。一旦我能够将一些数据解析到向量中,我就会想要用循环自动化它并使用&#34; getline&#34;或类似的功能为我抓取数据。
所以我的主要问题是: 1)为什么我的push_back和打印输出失败? 2)我如何用char循环读取char,以防止我手动将数据放入?
我在运行时收到的错误是: 细分错误(核心转储)
提前感谢大家的帮助和知识!
答案 0 :(得分:0)
ofstream
用于输出文件。使用ifstream
来阅读文件。
vector<string> grid;
vector<string>
适用于您的情况。但使用vector<vector<char>>
创建向量的二维数组更容易,然后访问grid[x][y]
与数组不同,向量在创建时不具有任何元素,因此在您向其添加内容之前,没有有效的grid[x][y]
或grid[x]
。
请尝试使用此代码:
int main()
{
ifstream fin("test.txt");
vector<vector<char>> grid;
int row = 0;
string line;
while(fin >> line)
{
grid.resize(row + 1);
for(auto c : line)
grid[row].push_back(c);
row++;
}
for(auto row_vector : grid)
{
for(auto e : row_vector)
cout << e;
cout << "\n";
}
return 0;
}