使用运算符>>读取.CSV文件

时间:2013-09-25 07:54:17

标签: c++ class csv

我有一个阅读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;”。如何使用这个课程?

1 个答案:

答案 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