2013-06-15 4 views
1

Я хочу загрузить многомерный массив из файла, у меня есть этот код:Загрузка многомерного массива из файла

std::vector<std::vector<int>> matrix; 
for (int r = 0; r < cols; r++) 
{ 
    std::vector<int> row; 
    for (int c = 0 ; c < cols ; c++) 
    { 
     int temp; 
     if (fin >> temp) 
     { 
      std::cout << temp; 
      row.push_back(temp); 
     } 
    } 
    matrix.push_back(row); 
} 

переменной Cols отлично, вложенный цикл называются 9 раз, если у меня есть массив 3х3, так это работает как ожидалось ... Однако кажется, что файл не может прочитать одно целое (fin >> temp). Fin - это обработчик файлов. Что не так?

Содержание файла:

0 1 1 
0 0 1 
1 1 1 

Весь код:

std::vector<std::vector<int>> foo() 
{ 
    std::string filename; 
    std::cout << "Filename: "; 
    std::cin >> filename; 

    std::vector<std::vector<int> > matrix; 
    std::ifstream fin(filename); 
    if(!fin) { 
     std::cout << "Error"; 
     exit(EXIT_FAILURE); 
    } 

    std::string line; 
    int cols = 0; 
    if(fin.is_open()){ 
     while(!fin.eof()){ 
      std::getline(fin,line); 
      cols++; 
     } 
    } 
    for (int r = 0; r < cols; r++) 
    { 
     std::vector<int> row; 
     for (int c = 0 ; c < cols ; c++) 
     { 
      int temp; 
      if (fin >> temp) 
      { 
       std::cout << temp; // displays nothing 
       row.push_back(temp); 
      } 
         std::cout << temp; // displays some crap like -84343141 
     } 
     matrix.push_back(row); 
    } 
    std::cin >> filename; // to stop execution and see the results 
    return matrix; 
} 
+0

покажите нам файл. –

+0

Файл представляет собой просто простую матрицу, где всегда column = rows. – user2252786

+1

@DavidJashi: Нет, нет. Он читает только следующее целое число. –

ответ

2

Вы делаете первый проход через файл, чтобы определить размер, но вы будете нуждаться, чтобы открыть файл после прочитав его в первый раз. В противном случае в файле не должно быть данных.

+0

Так же просто, как и что... – SChepurin

0

Попробуйте добавить

fin.seekg (0, is.beg); 

до того, как для цикла.

Поскольку в

std::string line; 
int cols = 0; 
if(fin.is_open()){ 
    while(!fin.eof()){ 
     std::getline(fin,line); 
     cols++; 
    } 
} 

вы получите позиции в файле на eof и

if (fin >> temp) 

всегда возвращает ложь. Вот почему вам нужно установить позицию в начало файла.

Вы также можете заменить

while(!fin.eof()){ 
     std::getline(fin,line); 
     cols++; 
    } 

с более легкой

while(std::getline(fin,line)) cols++; 
0

Сначала прочитать файл и вычислить количество строк и столбцов, а затем закройте файл. Затем снова прочитайте файл, и теперь зациклируйте до вычисленных строк и столбцов

Смежные вопросы