C++ text file with columns into 2D vector

半腔热情 提交于 2021-01-20 13:34:13

问题


I have a text file that has values and I want to put them into a 2D vector.

I can do it with arrays but I don't know how to do it with vectors.

The vector size should be like vector2D[nColumns][nLines] that I don't know in advance. At the most I can have in the text file the number of columns, but not the number of lines. The number of columns could be different, from one .txt file to another.

.txt example:

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

with arrays I do it like this:

//------ 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;  
    }
}

回答1:


My suggestion:

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);  
}

Now your dataset has:

values.size() // number of lines

and can be adressed with array notation also (besides using iterators):

float v = values[i][j];

Note: this code does not take into account the fact that the last line may have less that nCol data values, and so the end of the line vector will contain wrong values at end of file. You may want to add code to clear the end of the line vector when done becomes false, before you push it into values.




回答2:


Instead of using

float values[nCol][nLin]; 

use

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

You have to #include<vector> for this.

Now you don't need to worry about size.

Adding elements is as simple as

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

Also do not use .eof() on streams, because it doesn't set it until after the end has been reached and so it will attempt to read the end of the file.

while(!inFile.eof()) 

Should be

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

NOTE: Instead of vector, you can also use std::array, which is apparently the best thing after sliced bread.



来源:https://stackoverflow.com/questions/65759417/reading-column-specific-data-in-c

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!