Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

Why is getline not splitting up the the stringstream more than once?

When I’m trying to read data from a file, it is not updating the value of tempString2.

Instead of grabbing and splitting the new line, it just holds the last value of the first data line.

The reason I believe that the second getline is the issue is that the data is being read in, and the loops are running the exact number of times that I need them to.

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

#include <iostream>
#include <fstream>
#include <string>
#include <sstream>

void PopulateWindLog(int dataIndex, std::string fileName, int const headerVecSize)
{
    std::string tempString;
    std::string tempString2;
    std::stringstream tempStream;

    // open data file
    std::ifstream dataFile(fileName);

    // skip the header line
    std::getline(dataFile, tempString);

    // while there is still data left in the file
  
    while(std::getline(dataFile, tempString))
    {
        tempStream << tempString;
        std::cout << tempString << std::endl;

        for(int i = 0; i < headerVecSize; ++i)
        {
            std::getline(tempStream, tempString2, ',');
            std::cout << tempString2 << std::endl;

            if(i == dataIndex)
            {
                std::cout << tempString2 << " INSIDE IF STATEMENT !!!! " << std::endl;
            }
            
        }
    }
}

This is the dataset that I’m using. For replication, I’m looking for column ‘S’ (index 10). headerVecSize is 18.

WAST,DP,Dta,Dts,EV,QFE,QFF,QNH,RF,RH,S,SR,ST1,ST2,ST3,ST4,Sx,T
31/03/2016 9:00,14.6,175,17,0,1013.4,1016.9,1017,0,68.2,6,512,22.7,24.1,25.5,26.1,8,20.74
31/03/2016 9:10,14.6,194,22,0.1,1013.4,1016.9,1017,0,67.2,5,565,22.7,24.1,25.5,26.1,8,20.97
31/03/2016 9:20,14.8,198,30,0.1,1013.4,1016.9,1017,0,68.2,5,574,22.7,24,25.5,26.1,8,20.92

This is the output that I’m getting.
Output of the built program

>Solution :

std::getline() extracts characters from input and appends them to str until one of the following occurs (checked in the order listed)

  • end-of-file condition on input, in which case, getline sets eofbit.
  • the next available input character is delim, as tested by Traits::eq(c, delim), in which case the delimiter character is extracted from input, but is not appended to str.
  • str.max_size() characters have been stored, in which case getline sets failbit and returns.

(from https://en.cppreference.com/w/cpp/string/basic_string/getline)

So after reading all elements from your first input line, tempstream.good() is false. No further input is read.

Proposed solution: Move definition of tempstream into your while loop. You will get a stream in good state for each line.

Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading