Search code examples
c++getlineistream

Getline to read data from txt file


I'm having a bit of a problem with extracting data from a simple .txt file with the getline command.

The txt file is very simple: a column of 400 numbers. I use a vector to store them with the following code:

int i = 0;
string line;
vector <double> vec;

while (getline(input, line))
{
    vec.push_back(i);
    N++;
    input >> vec[i];
    i++;
} 

It correctly creates a vector of 400 elements but first line of txt file is ignored (I end up with vec[0] = 2nd line of txt file instead of 1st) and 399th element is 399 instead of the 400th line of txt file.

I tried several other ways to extract this data but it was unsuccessful.

Thank you for your help!

EDIT:

I have edited the code according to some of the remarks:

vector <double> vec;
string line;
double num;

while (getline(input, line))
{
    input >> num;
    vec.push_back(num);
}

Unfortunately, it still skips the first line of my text file.

EDIT 2 --> SOLUTION:

Thanks to all of your remarks, I realized that I was doing something wrong when using both getline and input >> num;

Here is how the problem was solved:

double num;
vector <double> vec;

while (input >> num)
{
    vec.push_back(num);
}

Solution

  • You loose the first line due to reading from the file once more - here:

    while (getline(input, line))
        // ^^^^^^^ Here you read the first line
    {
        input >> num;
     // ^^^^^^^^ Here you will read the second line
    

    You told you want a vector of doubles - like:

    std::vector<double> vec;
    

    So you should use std::stod to convert the line read by getline into a double. Like:

    while (std::getline(input, line))
    {
        // Convert the text line (i.e. string) to a floating point number (i.e. double)
        double tmp;
        try
        {
            tmp = stod(line);
        }
        catch(std::invalid_argument)
        {
            // Illegal input
            break;
        }
        catch(std::out_of_range)
        {
            // Illegal input
            break;
        }
    
        vec.push_back(tmp);
    } 
    

    Don't do input >> num; inside the loop.

    If you really want to use input >> num; then you shall not use getline. That is - you can use either but not both.