2013-05-18 4 views
1

나는 다음과 같습니다 텍스트 파일에서 데이터를로드하려고 :쉼표로 구분 된 텍스트 파일에서 2D 배열로 데이터로드?

161,77,88,255 0,44,33,11,111

등 내가 그것을 조작하는 기능을 가지고 있고, 보장하고 배열이 올바른 크기인지 (여전히 다를 수 있음) 다른 사람이있을 수 있지만 나는 내 오류의 원인이 될 믿기 때문에

bool loadData(int **imgPix, string fileName) { 

ifstream inputFile; 

inputFile.open(fileName.c_str()); 

string tempLineRow; //The resulting line from the text file 
string tempElementColumn; //The individual integer element 
int numberOfCols = 0; 
int numberOfRows = 0; 


if (!inputFile.is_open()) { 
    return false; 
} 

imgPix = new int* [numberOfRows]; 

    while (getline(inputFile, tempLineRow, '\n')) { 

     stringstream ss; 
     ss << tempLineRow; //Stringstream version of the line 

     while (getline(ss, tempElementColumn, ',')) { 
      stringstream ss2; 
      ss2 << tempElementColumn; 
      ss2 >> numberOfCols; 

//Prob?   (**imgPix) = *(*(imgPix + numberOfRows) + numberOfCols); 
      numberOfCols++; 

     } 

     numberOfRows++; 

    } 

inputFile.close(); 
return true; 

} 내가 코멘트와 이중 포인터 할당과 선을 표시 한

: 아래 구현에서 내 시도이다 . while 루프 구조를 사용하여 반복적으로 2D 배열을 업데이트하는 방법을 잘 모르겠습니다.

누구에게 도움을 줄 수 있습니까? 대단히 감사하겠습니다!

답변

0
imgPix = new int* [numberOfRows] 

여기서 numberOfRows = 0이므로 충분한 메모리를 할당하지 않습니다. 메모리를 할당하기 전에 배열의 크기를 알아야합니다. 그리고 또한, 상기 어레이의 각 행에 대해 메모리를 할당한다 : 2 차원 직사각형 어레이

imgPix[currentRow] = new int [TotalCols]; 

, TotalCols 요소 TotalRows 1 차원 배열 *을 작성하는 것이 더 효과적 일 후 것 수식 A(row, col) = A[row*TotalCols + col]을 사용하여 액세스하십시오.

+0

100 % 정확하지만 중요한 점은 "하나는 사전에 치수를 알아야합니다"라는 것이므로이 접근법은 막 다른 길로 인도합니다. std :: vector를 사용하면 OP를 처리하기가 훨씬 쉬워집니다. –

+0

예,'std :: vector'를 사용하는 것이 더 쉽고 우아합니다. 글쎄,'벡터'의'벡터'는 오버 헤드를 생각 합니다만, 아마도 성능은 여기 중요하지 않습니다. 어쨌든, 그는 미리 배열의 적어도 하나 (내부) 차원을 알아야합니다. – Inspired

0

코드에 몇 가지 문제가 있습니다. 대부분 C++에서 기본 제공 배열이 작동하는 방식을 완전히 이해하지 못했기 때문입니다. 여기서 가장 중요한 문제는 동적으로 쉽게 커질 수 없다는 것입니다. 배열에 대한 "크기 조정"작업은 없습니다 (단 하나 필요합니다). 따라서 std::vector<int>std::vector< std::vector<int> >을 사용하여 코드를 다시 작성하려고 할 때 새 행이나 열을 저장하고이 새로운 구현에 문제가 생길 때 다시 묻는 경우 .resize을 사용해야합니다.

0

이전 답변이 유효하지만 연속 메모리가 필요하지 않은 경우 많은 메모리 재 할당을 피하기 위해 에 비해 std::deque이 더 나은 선택 일 수 있습니다.

관련 문제