2014-10-24 3 views
1

나는 stackoverflow에 집에 넣는 것을 싫어한다. 죄송합니다.Home Work : 포인터 - 투 - 포인터 char (char **)로 파일 읽기

나는 다음과 같은 선언을 맞는 함수를 작성해야

char ** read_maze(char *filename, int *rows, int *cols) 

내가 지금까지 쓴 연료 소모량은

char ** read_maze(char *filename, int *rows, int *cols) 
{ 
    ifstream maze(filename); 
    maze >> *rows >> *cols; 
    char * contents[] = new char * [*rows * *cols]; 
    for (int r = 0; r < *rows; r++) { 
    for (int c = 0; c < *cols; c++) { 
     if (!maze.eof()) 
     maze >> contents[r][c]; 
    } 
    } 
    return contents; 
} 

내가 액세스/쓰기되는 데 문제입니다 문자 배열 contents이 나에게 분할 오류를 제공하고 있습니다. 모든 종류의 다른 접근자를 시도하고 segfault가 발생하는 것을 막을 수 없습니다.

나는 포인트 포인터 문자를 C++로 액세스하는 방법에 대한 검색을 시도했지만 완전히 실질적인 것을 찾지 못했습니다.

내가 시도한 것들 : * 내용 [r * c], (내용 + rc), * ((내용 [r]) + c) 및 기타 많은 것들.

char **으로 파일을 읽을 수있는 방법은 무엇입니까?

감사

이 라인으로
+1

당신은'contents [r]'을 초기화하거나'std :: vector '. – Jarod42

+0

행과 열 변수는 무엇입니까? 그리고 나는 틀릴 수도 있지만 내용이'** char []'로 초기화되고있는 것처럼 보입니다. char [x]를 할당하기 전에 할당해야합니다. – cxdf

답변

3

나는 당신이 필요로하는 무엇이라고 생각

char** read_maze(const char* filename, int& rowCount, int& colCount) 
{ 
    std::ifstream maze(filename); 
    maze >> rowCount>> colCount; 
    char** contents = new char* [rowCount]; 
    for (int r = 0; r != rowCount; ++r) { 
     contents[r] = new char[colCount]; 
     for (int c = 0; c != colCount; ++c) { 
      if (!maze.eof()) { 
       maze >> contents[r][c]; 
      } 
     } 
    } 
    return contents; 
} 

을하지만 당신은 당신의 콘텐츠를 자신 delete[]와 파괴해야합니다 :

void delete_maze(char** contents, int rowCount) 
{ 
    for (int r = 0; r != rowCount; ++r) { 
     delete [] contents[r]; 
    } 
    delete [] contents; 
} 
+0

불행히도 이것은 숙제이므로 벡터를 사용할 수 없습니다. – OneChillDude

+0

고마워요! 너는 내 하루를 보냈다! – OneChillDude

+0

레코드의 경우 메소드 선언을 약간 수정해야하고 (포인터를 취함)'const' 파일 이름을 사용하지 말아야합니다 (확실하지 않은 이유는 무엇입니까?) 큰! – OneChillDude

0

당신은 문자의 포인터에 대한 포인터를 가지고있다.

char **contents = new char * [*rows * *cols]; 

이제 메모리를 할당해야하는 많은 char 포인터가 있습니다.

for (int r = 0; r < *rows; r++) { 
    for (int c = 0; c < *cols; c++) { 
      contents[r][c] = new char[SIZE_OF_STRING]; 
    } 
} 

또는 대신 C 스타일의 문자 * -pointers을 방지하기 위해 std::string를 사용할 수 있습니다 당신은 이런 식으로 할 수 있습니다.

std::ifstream maze(filename); 
std::size_t rowCount, colCount; 
maze >> rowCount >> colCount; 
std::vector<std::vector<char>> content(rowCount, std::vector<char>(colCount)); 
for (auto &columns : content) { 
    for (auto& c : columns) { 
     maze >> c; 
    } 
} 

정말 new [] 사용하려면 :

+0

예, for 루프 앞에 this 루프를 실행해야합니다. 그러나 당신이 ofstream으로해야만하는 것을 쓰고 싶다면 고려해야 할 것이 있습니다. ifstream을 사용하면 물건 만 읽을 수 있습니다. – Mosa