带有列到2D向量中的C ++文本文件

时间:2013-12-09 12:43:36

标签: c++ arrays vector root

我有一个包含值的文本文件,我想将它们放入2D矢量中。

我可以用数组来做,但我不知道如何使用向量。

矢量大小应该像vector2D [nColumns] [nLines],我事先并不知道。我最多可以在文本文件中包含列数,但不包括行数。 列数可能不同,从一个.txt文件到另一个。

.txt示例:

189.53  -1.6700 58.550  33.780  58.867
190.13  -3.4700 56.970  42.190  75.546
190.73  -1.3000 62.360  34.640  56.456
191.33  -1.7600 54.770  35.250  65.470
191.93  -8.7500 58.410  33.900  63.505

使用数组我这样做:

//------ Declares Array for values ------//
const int nCol = countCols; // read from file
float values[nCol][nLin]; 

// Fill Array with '-1'
for (int c = 0; c < nCol; c++) {
    for (int l = 0; l < nLin; l++) {
        values[c][l] = -1;
    }
}

// reads file to end of *file*, not line 
while (!inFile.eof()) {
    for (int y = 0; y < nLin; y++) {
        for (int i = 0; i < nCol; i++) {
            inFile >> values[i][y];
        }
        i = 0;  
    }
}

2 个答案:

答案 0 :(得分:2)

而不是使用

float values[nCol][nLin]; 

使用

std::vector<std::vector<float>> v;

你必须#include<vector>

现在您不必担心尺寸。

添加元素就像

一样简单

std::vector<float> f; f.push_back(7.5); v.push_back(f);

也不要在流上使用.eof(),因为直到达到结束后它才会设置它,因此它会尝试读取文件的结尾。

while(!inFile.eof()) 

应该是

while (inFile >> values[i][y]) // returns true as long as it reads in data to values[x][y]

注意:您也可以使用vector代替std::array,这显然是切片面包后的最佳选择。

答案 1 :(得分:1)

我的建议:

const int nCol = countCols; // read from file
std::vector<std::vector<float>> values;  // your entire data-set of values

std::vector<float> line(nCol, -1.0);  // create one line of nCol size and fill with -1

// reads file to end of *file*, not line 
bool done = false;
while (!done) 
{
    for (int i = 0; !done && i < nCol; i++) 
    {
        done = !(inFile >> line[i]);
    }
    values.push_back(line);  
}

现在您的数据集包含:

values.size() // number of lines

并且也可以使用数组表示法(除了使用迭代器):

float v = values[i][j];

注意:此代码未考虑最后一行可能具有较少nCol数据值的事实,因此行向量的末尾将在文件末尾包含错误的值。在将其推入值之前,您可能希望添加代码以在完成变为false时清除线矢量的结尾。