2016-09-12 6 views
0

У меня есть небольшая проблема. Я пытаюсь прочитать из файла и вывести данные чтения в 2d-массив в C++. Я создал файл .txt и исправлял свой код, но не смог выяснить, в чем проблема.C++ чтение 2d массива из файла

Мой код выглядит следующим образом:

#include <iostream> 
#include <fstream> 
// this is for file handleing 

using namespace std; 

int Sudoku[9][9]; 

int main() 
{ 
    ifstream fp("sudoku.txt"); 
    // this is for reading and opening existing file sudoku.txt 
    for(int row = 0; row < 9; row++){ 
     for(int column = 0; column < 9; column++){ 
      fp >> Sudoku[row][column]; 
      // from fp we read the characters 
     } 
    } 
    for(int row = 0; row < 9; row++){ 
     for(int column = 0; column < 9; column++){ 
      cout << Sudoku[row][column] << " "; 
     } 
     cout << endl; 
    } 
    fp.close(); 
    return 0; 

Мой текстовый файл выглядит следующим образом:

6 4 0 0 0 0 8 0 1 
5 0 0 7 0 0 0 2 0 
2 7 0 4 9 0 0 0 0 
0 3 6 5 1 8 0 9 0 
0 0 0 3 0 2 0 0 0 
0 5 0 9 6 7 1 4 0 
0 0 0 0 7 4 0 8 6 
0 8 0 0 0 9 0 0 2 
7 0 1 0 0 0 0 5 9 

Мой первый вопрос: В предыдущей версии, мой массив был определен внутри основной функции. Я всегда делал вывод мусора вместо содержимого моего файла. Я не понимаю этого: должен ли я определять массив Sudoku вне моей основной функции, чтобы не получить явно неправильные значения, хранящиеся в его элементах, и почему?

Мой второй вопрос: выход моего текущего кода - это много нулей. Я ожидал найти элементы, считанные из файла. Я тоже этого не понимаю. Что я делаю не так? Я попытался найти ответ, но я пытаюсь написать только эту часть моего решения sudoku, и я застрял.

+2

Правильный инструмент для решения таких проблем - ваш отладчик. Перед тем, как просить о переполнении стека, вы должны пропустить свой код по очереди *. Для получения дополнительной информации, пожалуйста, прочтите [Как отлаживать небольшие программы (Эрик Липперт)] (https://ericlippert.com/2014/03/05/how-to-debug-small-programs/). Как минимум, вы должны \ [изменить] ваш вопрос, чтобы включить пример [Минимальный, полный и проверенный] (http://stackoverflow.com/help/mcve), который воспроизводит вашу проблему, а также замечания, сделанные вами в отладчик. –

+0

Помимо вашего вопроса, вы можете быть заинтересованы в моем коде для чтения, таком как файл: http://www.topbug.net/blog/2013/01/10/load-a-matrix-from-an-ascii-format- file/ – xuhdev

+2

Перед повторным открытием голосования подумайте об этом [комментарий] (http://stackoverflow.com/questions/39457808/c-reading-2d-array-from-file?noredirect1_comment66237324_39457954) от OP «Спасибо. «Я нашел проблему, я немного устал, и я ошибся в текстовом файле». Никакого вреда не было, но, возможно, лучше остаться закрытым. –

ответ

1

две проблемы связаны между собой, и это связано с проблемм с чтением файла:

  • в первом случае вы получите мусор, потому что локальный массив не инициализирован. По мере сбоя чтения файла мусор остается.
  • во втором случае вы получаете 0, потому что глобальный массив имеет статический тип хранилища, и он инициализируется нолем перед его использованием.

Лучше сохранить переменные локально, если вы не обязаны в противном случае. Вы должны проверить, если ifstream fp(...); может открыть файл или если есть проблема:

ifstream fp("sudoku.txt"); 
if (! fp) { 
    cout << "Error, file couldn't be opened" << endl; 
    return 1; 
}  
for(int row = 0; row < 9; row++) { // stop loops if nothing to read 
    for(int column = 0; column < 9; column++){ 
     fp >> Sudoku[row][column]; 
     if (! fp) { 
      cout << "Error reading file for element " << row << "," << col << endl; 
      return 1; 
     } 
    } 
} 

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

+1

Спасибо. Я нашел проблему. Я немного устал, и я ошибся в текстовом файле. – Qbeer666

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