0

我有一堂课来阅读 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;”处出错。如何使用这个类?

4

1 回答 1

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

于 2013-09-25T12:23:45.053 回答