2016-09-12 3 views
0

작은 문제가 있습니다. 파일에서 읽으려고하고 C++에서 2 차원 배열로 읽은 데이터를 출력합니다. .txt 파일을 만들고 코드를 수정했지만 문제가 무엇인지 알 수 없습니다.파일에서 2 차원 배열을 읽는 C++

#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 배열을 정의해야 하는가?

두 번째 질문 : 현재 코드의 출력 결과는 제로입니다. 파일에서 읽은 요소를 다시 찾을 것으로 예상했습니다. 나는 이것도 이해하지 못한다. 내가 도대체 ​​뭘 잘못하고있는 겁니까? 나는 대답을 찾으려고 노력했지만 스도쿠 해결사의이 부분 만 쓰려고하고 있는데 막혔다.

+2

이러한 문제를 해결하는 올바른 도구는 디버거입니다. 스택 오버플로를 묻기 전에 코드를 단계별로 실행해야합니다. 자세한 도움말은 [작은 프로그램 디버깅 방법 (Eric Lippert 작성)] (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

투표를 다시 열어보기 전에 OP로 "[comment] (http://stackoverflow.com/questions/39457808/c-reading-2d-array-from-file?noredirect=1#comment66237324_39457954) 고맙습니다. 문제가 발생했습니다. 조금 피곤해서 텍스트 파일 이름을 잘못 입력했습니다. "라고 말하면서 아무런 해를 끼치 지 않았지만 닫히는 것이 좋습니다. –

답변

1

두 가지 문제가 연결되어, 그것은 파일 읽기와 problemm에 관련이 :

  • 당신이 쓰레기를 얻을 첫 번째 경우에, 로컬 배열이 초기화되지 않기 때문에. 파일을 읽지 못하면 쓰레기가 남습니다.
  • 두 번째 경우에는 전역 배열에 정적 저장소 유형이 있으며 사용하기 전에 0으로 초기화되므로 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

관련 문제