2014-01-28 2 views
0

'지도'배열을 만들었으며 '지도'파일에서 배열을 채우려고합니다. 창조에 나는 다음과 같은 값을 '0'배열의 각 요소지만 '지도'파일을 포함 할당합니다파일에서 배열 채우기가 작동하지 않습니다.

MAP : 나는 'loadMap()'

를 사용하여지도를로드

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 

loadMap() :이 예에서

void room::loadMap() 
{ 
    int x=0; 
    int y=0; 
    string line; 
    ifstream mapFile(NAME + "_MAP.txt"); 

    while(!mapFile.eof()) 
    { 
     for(int i=0; i<cellsY; i++) 
     { 
      getline(mapFile,line,'\n'); 

      for(int j=0; j<cellsX; j++) 
      { 
       getline(mapFile,line,' '); 
       map[(cellsX*j) + cellsY] = atoi(line.c_str()); 
      }; 
     }; 
    } 

    y = 10; 
    x = 15; 
    for(int i=0; i<y; i++) 
     { 
      cout << endl; 
      for(int j=0; j<x; j++) 
      { 
       cout << map[(x*j) + y]; 
      }; 
     }; 
} 

요소가 여전히 '0'으로 지정됩니다,하지만 난지도 파일의 레이아웃을 모방하려합니다.

+0

검색 StackOverflow "read file eof". –

+0

왜'getline'을 사용하고 있습니까? 이것은'file >> 변수를 사용하는 좋은 경우입니다. –

+0

파일이 실제로 성공적으로 열려 있습니까? –

답변

0

처음에는 입력 작업을 테스트하지 않았고 테스트가 성공했다는 것을 테스트하지 않았습니다. 그런 다음 외부 루프에서 을 파일에서 읽은 다음 멀리 내 보낸 다음 내부 루프에서 을 더 읽습니다. 인덱스의 계산이 잘못되었습니다. 오류 처리에 대한

std::ifstream mapFile(...); 
if (!mapFile.is_open()) { 
    // Error handling... 
} 
for (int i = 0; mapFile && i != cellsY; ++ i) { 
    std::string line; 
    if (std::getline(mapFile, line)) { 
     std::istringstream text(line); 
     for (int j = 0; j != cellsX && text >> map[cells X * i + j]; ++ j) { 
     } 
     if (j != cellsX) { 
      // Error: missing elements in line 
     } 
     text >> std::ws; 
     if (text && text.get() != EOF) { 
      // Error: garbage at end of line 
     } 
    } 
} 

, 간단한 당신 일부를 반환 할 수 있도록 오류를 지적하고 계속 단지 출력에 적절한 오류 메시지입니다 : 당신은 아마 찾고있는 무엇

는 무언가 같이가 마지막에 일종의 오류 코드.

+0

호기심에서 벗어나 대신'mapFile >> value'를 사용하지 마십시오. 'getline'과'istringstream'의 차이점은 무엇입니까? –

+0

입력 형식에는 행당 하나의 행이 필요하기 때문에 (또는 필요로하는 것처럼 보입니다. 'mapFile >> value'는'cellsX * cellsY' 값의 어떤 순서라도 받아 들일 것입니다. 물론 괜찮다면'getline '을 놓는 것이 가장 간단한 해결책이 될 것입니다. –

+0

나는 내가 믿는 getline을 떨어 뜨릴 것이다. 아직도 꼬임을 풀고있다. –

0

나는 이것이 당신이 찾고있는 것이라고 생각합니다.

void room::loadMap() 
{ 
    int x=0; 
    int y=0; 
    ifstream mapFile(NAME + "_MAP.txt"); 

    for(int i=0; i<cellsY; i++) 
    { 
     for(int j=0; j<cellsX; j++) 
     { 
     int v; 
     mapFile >> v; 
     if (mapFile.eof()) 
     { 
      break; 
     } 
     map[(cellsX*j) + cellsY] = v; 
     } 
    } 

    y = 10; 
    x = 15; 
    for(int i=0; i<y; i++) 
    { 
     cout << endl; 
     for(int j=0; j<x; j++) 
     { 
     cout << map[(x*j) + y]; 
     }; 
    }; 
} 
+0

'while (! mapFile.eof())는 틀 렸습니다. (사람들은 어디에서 그런 아이디어를 얻습니까?) –

+0

오류를 지적 해 주신 @JamesKanze에게 감사드립니다. 코드를 수정했습니다. –

+0

'if (mapFile.eof())가 여전히 잘못되었습니다. (여기서 단순히 '중단'을 사용하는 것과 같습니다.) –

관련 문제