我有一个阅读CSV文件的课程
class CSVStudentReader {
ifstream inStream;
public:
CSVStudentReader(string fileName): inStream(fileName.c_str()) {}
Student* readNextStudent() {
if (inStream.good())
{
string name;
float math;
float english;
inStream >> name >> math >> english;
return new Student(name, math, english);//Student is another class
}
return NULL;
}
~CSVStudentReader()
{
inStream.close();
}
};
我必须使用此类来读取CSV文件,并且不得更改它。但是CSV文件由“,”分隔,所以程序错误在“inStream>> name>> math>> english;”。如何使用这个课程?
答案 0 :(得分:1)
有很多方法可以做到这一点。一种是创建一个将逗号分类为空格的类。使用cppreference中的示例:
#include <locale>
#include <vector>
class csv_whitespace
: public std::ctype<char>
{
public:
static const mask* make_table()
{
static std::vector<mask> v(classic_table(), classic_table() + table_size);
v[','] |= space;
v[' '] &= ~space;
return &v[0];
}
csv_whitespace(std::size_t refs = 0) : ctype(make_table(), false, refs) { }
};
#include <memory>
class csv_student_reader
{
private:
std::ifstream file;
public:
csv_student_reader(std::string path) :
file{path}
{
file.imbue(std::locale(file.getloc(), new csv_whitespace));
}
std::unique_ptr<Student> read_next_student()
{
std::string name;
float math;
float english;
if (file >> name >> math >> english)
{
return new Student{name, math, english};
}
return nullptr;
}
};
编译:
g++-4.8 -std=c++11 -O2 -Wall -Wextra -pedantic -pthread main.cpp && ./a.out