2013-05-18 57 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,所以你沒有分配足夠的內存。在分配內存之前,您需要知道數組的維數。 然後還應該分配一個存儲器,用於所述陣列中的每一行:

imgPix[currentRow] = new int [TotalCols]; 

對於2維矩形陣列,這將是更有效的創建TotalRows的1維陣列* TotalCols元素,然後使用公式A(row, col) = A[row*TotalCols + col]訪問它。

+0

100%正確,但關鍵點是「需要事先知道尺寸」,所以我想這種方法會導致死路一條。使用std :: vector會讓事情變得更容易處理OP。 –

+0

是的,使用'std :: vector'更簡單,更優雅。好吧,'vector'' vector's對我來說是一個開銷,但是這裏的表現可能並不重要。無論如何,他需要事先知道陣列的至少一個(內部)維度。 – Inspired

0

你的代碼有幾個問題,我主要猜測是因爲你沒有完全理解內置數組是如何在C++中工作的。這裏的主要問題是那些不能動態增長,沒有對這些數組進行「調整大小」操作(但在這裏你需要一個)。因此,我建議您嘗試使用std::vector<int>std::vector< std::vector<int> >重寫您的代碼,確保在存儲新行或列時使用.resize,並在遇到此新實現出現問題時再次提出問題。

0

以前的答案是有效的,但如果不需要連續內存,在這種情況下,std::deque可能是一個比std::vector更好的選擇,以避免大量內存重新分配。

相關問題