2013-04-08 3 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 :: COUT слово. –

+0

Я знаю, где проблема. Когда я сохранил матрицу, после каждого номера есть пробел. Поэтому, когда я читаю строку, у меня есть что-то вроде «0 1 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]; 
+0

Это отличное решение, но я боюсь, что он будет удален от OP, чтобы быть полезным. –

+1

Я считаю, что не нужно просто предлагать самое простое исправление для сломанного кода ... Код OP ясно показывает, что C++ не является его/ее самой сильной точкой и, следовательно, может извлечь выгоду из лучшего примера. –

+0

Когда я использую matlab, я мог бы просто сохранить матрицу в файле .mat. Поэтому мне было интересно, есть ли лучший способ для C++ сохранять матрицу и читать матрицу. –