2013-04-08 45 views
0

我將一個布爾矩陣(ROW * ROW)保存爲.txt文件(0,1格式)。如何讀取文件

如何從文件中讀取矩陣?我在下面寫了代碼,但是我將讀取結果與文件進行比較,並且數組結果與文件不匹配。有人能告訴我我寫錯了嗎?或者有沒有更簡單的方法來讀取矩陣文件?

bool **results = new bool*[ROW]; 
    for(int i=0;i<ROW;i++){ 
     results[i] = new bool[ROW]; 
    } 

    ifstream infile; 
    infile.open ("FRM.txt"); 
    string line; 
    int row=0; 
    if (infile.is_open()) 
    { 
     while (infile.good()) 
     { 
      getline(infile,line); 
      istringstream iss(line); 
      int col=0; 
      while(iss) 
      { 
       string word; 
       iss >> word; 
       int number = atoi(word.c_str()); 
       if(number==1){ 
        results[row][col] = true; 
       } 
       else{ 
        results[row][col] = false; 
       } 
       col++; 
      } 
      row++; 
     } 
    } 
    infile.close(); 
+0

請的std ::法院字。 – 2013-04-08 06:12:28

+0

我知道問題所在。當我保存矩陣時,每個數字後面都有一個空格。所以當我讀一行時,我得到了類似「0 1 1 1」的內容,最後一個空格導致了錯誤。因爲「字符串」實際上會處理「」,並將其視爲整數0. – 2013-04-08 06:26:36

回答

1

將矩陣表示爲嵌套數組通常是一個壞主意。改爲使用線性數組,並通過宏或內聯函數執行索引 - 雜耍。

我會去這樣的事情:

#include <algorithm> 
#include <cmath> 
#include <cstdint> // uint8_t requires C++11 
#include <iterator> 
#include <vector> 

// don't use vector<bool>, it creates all sorts of problems 
std::vector<uint8_t> results; 
{ 
    std::ifstream infile('FRM.txt', std::ifstream::in); 
    if(infile.is_open() && infile.good()) 
    { 
    std::istream_iterator<uint8_t> first(infile), last; 
    copy(first, last, std::back_inserter(results)); 
    } 
} 

// only if you know the matrix is square! error checking strongly advised! 
size_t nrows = size_t(std::sqrt(results.size())); 

// accessing element (i,j) is then as easy as 
size_t i = 2, j = 3; // assuming nrows > i,j 
bool a_ij = results[i*rows+j]; 
+0

這是一個很好的解決方案,但我擔心它遠離OP有用。 – 2013-04-08 06:21:06

+1

我相信不應該簡單地爲破壞的代碼提供最簡單的修復程序...... OP的代碼清楚地表明C++不是他/她最強烈的一點,因此可以從更好的示例中獲益。 – 2013-04-08 06:26:16

+0

當我使用matlab時,我可以簡單地將矩陣保存爲.mat文件。所以我想知道,是否有更好的方法來保存矩陣,並讀取矩陣。 – 2013-04-08 06:28:06