简体   繁体   中英

Reading a input file into a vector

I'm trying to read a file of int 's and double 's into a vector but I am having difficulty doing so. Given something like:

1 2.1 3 4
2 4 
3
9 0.1

How can I use ifstream and the getline function to convert the string into integers and doubles & inserting this into a vector?

I know this is incorrect but I am thinking of something along the lines of:

vector<Pair *> vec; //Pair is a class that contains a int & a double data member
string str;
double num;
ifstream f;
f.open("name of file");
while(getline(f, str){
  num = stod(str);
}

To insert into the vector I believe I can do something along the lines of:

Pair * pairObj = new Pair(x,y); //"x" being of type int and "y" being of type double
v.push_back(pair);

I'm sorry if this is unclear, please let me know and I will do my best to explain myself.

strtod() is C. Proper C++ uses the >> operator.

Once you have read each line of text, construct a std::istringstream from the string, then use operator>> to parse it.

Something along these line::

std::ifstream f("name of file");

// Check if the file was succesfully opened, etc...

std::string str;

while( getline(f, str))
{
    std::istringstream i(str);
    std::vector<double> v;
    double d;

    while (i >> d)
    {
        v.push_back(d);
    }

    if (!i.eof())
    {
        // Must be a parsing failure, deal with it in some way.
    }
    else
    {
       // Otherwise, v is the vector of numbers on this line.
    }
}
string str;
std::vector< double> vd;
// loop reading lines of input
while( getline( f, str )
{
std::stringstream sst(str);
std::string a;
// loop reading space separated values in line
while( getline( sst, a, ' ' ) )
    // conver to double and add to end of vectior
    vd.push_back( stod( a );
}
// check for complete pairs
if( vd.size() % 2 )
    cout << "Error!"
// loop over pairs
vector< pair<int,double> > vpairs;
for( int kp = 0; kp < vd.size()/2; kp++ )
    vpairs.push_back( pair<int,double>( (int)vd[kp*2],vd[kp*2+1) ); 

You should just use stream iterators!

#include <iostream> // for IO
#include <vector> // for vector!
#include <iterator> // for stream iterator
#include <algorithm> // for copy (optional) 

if you are directly initializing

vector<double>vdata{istream_iterator<double>(ifile), 
                    istream_iterator<double>()};  

else use copy or copy_n if you only want a fixed amount of data

copy(istream_iterator<double>(ifile), 
     istream_iterator<double(),
     back_inserter(vdata)); 

if you are working with a large file i would recommend using this method

vector<doube>vdata;
// this will save alot of time, if you don't resize the vector must keep reallocating data
vdata.reserve(file_size);
copy(istream_iterator<double>(ifile), 
     istream_iterator<double>(),
     back_inserter(vdata)); 

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM