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();
4

1 に答える 1

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];
于 2013-04-08T06:16:33.593 に答える