C++文件流向量输入

问题描述:

我目前在使用C++。我的目标是通过我计划能够存储的一系列步骤来实现A *算法,并列出从点A到点B的最短路径。C++文件流向量输入

我的程序将采用命令行方式,这个参数将是一个读入的文件。给程序一个读入文件的目的是每个文件都是它自己的“网格”,以供A *处理。网格文件的格式如下:

货号1 = WIDTH然后货号2 = HEIGHT

O =开始

* =完成

。 =尚可节点

#=不可逾越的高墙

因此,一个示例格,让我们把它称为“GRID1”,将是:

8 5 
o......# 
......## 
.....### 
....#### 
.......* 

所以处理这种情况,当你运行程序,你会通过在“Grid1”中。 从这里开始,我计划创建一个文件流并将每个字符读入一个二维数组/矢量,以尝试重新创建网格,以便可以拥有位置。例如,在“Grid1”中,字符“o”将位于Array/Vector中的位置[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]; 

} 

然而,在关于我“的push_back”,看来,我不能够打印出或抛掷数据到载体。我主要想要[0] [0] [0] [1] [0] [2]等每个索引来保存每个单独的字符,以重新创建一个像我通过的网格。

我是不太清楚我做错了什么,因为我对矢量的使用相当缺乏经验,但是,将数据推入网格的代码纯粹是为了测试目的。一旦我能够将一些数据解析到矢量中,然后我想用循环来自动化它,并使用“getline”或类似函数为我获取数据。

所以我的主要问题是: 1)为什么我的push_back和print out失败? 2)如何通过循环读取char字符以防止手动输入数据?

我收到运行时错误是: 分段错误(核心转储)

谢谢大家提前为您的帮助和知识!

+3

无自我尊重C++编译器将编译'网格[0] [0] .push_back( “你好”);''时是grid',据称,一个' std :: vector ',没有大声吠叫。你的问题声称你编译了这个,并且在运行时崩溃了。这显然不是真正被编译的代码,如果是的话,但这个问题中显示的代码是幻想代码。如果你想要一个真正的问题的真实答案,有必要展示真正的代码,而不是幻想代码,[mcve]。此外,在这个问题上,冗长的介绍与任何东西都没有关系,只是浪费阅读时间。 –

+0

我的歉意,这实际上是我的代码,我只是简单介绍了为什么我使用矢量的第一个地方。我希望将来我能提出更好的问题,不管我做错了什么,我都会再次道歉,我只是想知道事情是为什么而不是在工作。我对使用C++向量相对比较陌生,当你提到它是绝对错误时,这就是我的问题,我不明白为什么这会是如此“荒谬”和“幻想” – Illu

+1

荒谬是你声称seg错误,一些只能在运​​行时出现的代码,无法编译,因此无法运行。我们不能告诉你是什么导致段错误,因为根据提供的信息,它根本不会发生。这是荒谬的。 – user4581301

ofstream用于输出文件。使用ifstream来读取文件。

vector<string> grid; 

vector<string>将适用于您的情况。但它更容易创建矢量的2-d阵列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; 
} 
+0

非常感谢Barmak,非常感谢您的协助。我完全失去了为什么我不能按照我想要的方式管理载体,但是我已经从ifstream切换到ifstream并遵循了类似的建议。我想我多了解一些关于如何完成我的目标感谢您的知识! – Illu

+0

最后一个问题,如果你不介意。 “row + 1”究竟是干什么的? – Illu