2013-05-18 44 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更好的选择,以避免大量内存重新分配。

相关问题