2017-10-14 72 views
0

我目前在使用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

回答

0

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