Here's how to do it using std::getline and std::ifstream:
#include <algorithm>
#include <fstream>
#include <iostream>
#include <iterator>
#include <string>
#include <sstream>
#include <vector>
class line {
public:
operator std::string() const {
return data_;
}
friend std::ostream& operator<<(std::ostream& out, const line& self) {
out << self.data_ << std::endl;
return out;
}
friend std::istream& operator>>(std::istream& in, line& self) {
std::getline(in, self.data_);
return in;
}
private:
std::string data_;
};
class csv_part {
public:
operator std::string() const {
return data_;
}
friend std::ostream& operator<<(std::ostream& out, const csv_part& self) {
out << self.data_;
return out;
}
friend std::istream& operator>>(std::istream& in, csv_part& self) {
std::getline(in, self.data_, ',');
return in;
}
private:
std::string data_;
};
int main() {
std::ifstream f_str_csv("myfile.csv");
if(f_str_csv.is_open()) {
std::vector<std::string> vec_str;
// Read all lines from file
std::copy(std::istream_iterator<line>(f_str_csv),
std::istream_iterator<line>(),
std::back_inserter(vec_str));
// loop through all lines read
for(std::vector<std::string>::const_iterator it = vec_str.begin();
it != vec_str.end();
++it) {
std::istringstream is(*it);
// Print every part of the line (separated with a comma),
// separated with a pipe symbol (|)
std::copy(std::istream_iterator<csv_part>(is),
std::istream_iterator<csv_part>(),
std::ostream_iterator<csv_part>(std::cout, "|"));
std::cout << std::endl;
}
} else {
std::cerr << "Could not open input file" << std::endl;
}
}
Notice how you can specify an argument to std::getline for it to use as an 'end-of-line' character. This is particularly useful to parse every line read as a comma-separated list.