2017-10-16 110 views
0

我是新來的C++使用的載體,我的目標是從文本文件中讀取一個矩陣,並將它們存儲到一個二維矢量,我的代碼如下:加載矩陣爲二維向量C++

#include <fstream> 
#include <iostream> 
#include <sstream> 
#include <string> 
#include <vector> 
int main() 
{ 
    std::ifstream in("input.txt"); 
    std::vector<std::vector<int> > v; 

    if (in) { 
     std::string line; 

     while (std::getline(in, line)) { 
      v.push_back(std::vector<int>()); 

      // Break down the row into column values 
      std::stringstream split(line); 
      int value; 

      while (split >> value) 
       v.back().push_back(value); 
     } 
    } 

    for (int i = 0; i < v.size(); i++) { 
     for (int j = 0; j < v[i].size(); j++) 
      std::cout << v[i][j] << ' '; 

     std::cout << '\n'; 
    } 
} 

現在的輸入說

10101010 
01010101 
10101011 
01011010 

我得到的

10101010 
1010101 
10101011 
1011010 

的輸出,即每次一0的開始時遇到它被省略了。我相信這個問題是在聲明while(分割>>值),但我不知道如何以更好的方式編碼。

+1

引導0對於一個整數意味着什麼,所以它們被丟棄。爲什麼不直接存儲字符串? – NathanOliver

+0

我認爲這是問題,因爲0是一個邏輯錯誤,它是ommited,所以我如何修復代碼以包含它? –

+0

我用字符串取得輸入文件的字符串,因爲它比逐個字符地讀取它的速度快,但我想稍後應用矩陣運算,因此我希望它們以整數形式存儲。 –

回答

1

看來,如果你真的想存儲位,但有分析包含了一條線,例如,10101010成一串比特莫名其妙掙扎。 如果你知道每行的最大比特數,你可以使用bitset<N>,它提供了一個易於使用的過載操作>>可以在類似10101010直接讀取。希望能幫助到你。

int main() 
{ 
    std::ifstream in("input.txt"); 
    std::vector<std::bitset<8> >v; 

    if (in) { 
     std::bitset<8> bits; 
     while (in >> bits) { 
      v.push_back(bits); 
     } 
    } 

    for (int i = 0; i < v.size(); i++) { 
     for (int j = 0; j < v[i].size(); j++) 
      std::cout << v[i][j] << ' '; 

     std::cout << '\n'; 
    } 
} 
+0

遠勝於我的答案 – pointerless

1

更換

while (split >> value) 
    v.back().push_back(value); 

for(int x=0; x<line.size(); x++){ 
    v.back().push_back((int)line[x] - (int)'0')); 
} 

和完全刪除您的字符串流。

+0

你能解釋一下「 - (int)的」 0'的部分代碼,請和感謝它的工作 –

+0

所以ASCII標準定義的數字作爲字符的順序,0到9,以鑄人品爲int然後減去值爲0給你的角色的價值。 – pointerless

+0

不是一個很好的解釋,但看[這裏](https://stackoverflow.com/questions/5029840/convert-char-to-int-in-c-and-c) – pointerless