读取.csv文件并将值存储到vector和struct c ++中

时间:2016-08-03 03:14:14

标签: c++ csv vector struct

我是C ++编程的新手,我正在尝试做一个练习题,但我真的不明白它是什么让我去做,因为一个向量只能容纳一种数据类型(除非它可以容纳更多):

读入.csv文件,其中每一行的结构如下:“username,gpa,age”。将这些值存储到包含username,gpa和age(string,float,int)的结构中,并将列表创建为向量。当您在每行中读取时,插入按用户名排序的向量列表。然后循环并打印出格式为:“username [gpa] age:#”的列表,例如“mark [3.9] age:19”,并将输出写入文件(使用C ++,而不是Unix)。

我是否应该将所有这些值放在与单独数据类型相同的向量中,或者将它们全部保存在一个字符串中然后插入它们?如何将这些值存储到结构中?如果有人能告诉我他们将如何解决这个问题,并给我一些非常好的示例代码,谢谢。

1 个答案:

答案 0 :(得分:0)

好的,听到它的声音,问题是你想要读取文件,将信息放入结构中,然后根据名称按字母顺序将结构插入到向量中。

我将结构化为:

struct StudentInfo {
    string name;
    string gpa;
    string age;
} StudentInfo;

然后我打开文件并将整个内容读成字符串。然后我读完字符串,用换行符标记它。当我得到每个字符串时,我会将它放入一个解析它并返回结构studentInfo的函数中。然后将结构插入向量。

解析函数如何工作的示例:

struct StudentInfo parseData(string iStr) {
    struct StudentInfo info;
    size_t subStrStart = 0;
    size_t subStrEnd = 0;
    subStrEnd = iStr.find(',', subStrEnd);
    info.name = iStr.substr(subStrStart, subStrStart - subStrEnd);

    subStrStart = subStrEnd;
    subStrEnd = iStr.find(',', subStrEnd+1);
    info.gpa = iStr.substr(subStrStart, subStrStart - subStrEnd);

    subStrStart = subStrEnd;
    subStrEnd = iStr.find(',', subStrEnd+1);
    info.age = iStr.substr(subStrStart, subStrStart - subStrEnd);

    return info;
}

我做的主要功能的一些伪代码:

vector<struct StudentInfo> infoVec;
string fileStr = read(filename.csv); // make an ifstream or something similar
string lineStr;
size_t subStrEnd = 0;
size_t subStrStart = 0;
while (subStrEnd < fileStr.Size) {
    subStrEnd = iStr.find('\n', subStrEnd); //alternatively use std::getline() directly on the file stream
    lineStr = iStr.substr(subStrStart, subStrStart - subStrEnd);
    subStrStart = subStrEnd;
    subStrEnd++;
    infoVec.insert(parseData(lineString));
}
sortByName(infoVec) // User defined function
printInfoVec(infoVec) // User defined function

打印功能和排序功能非常自我解释,但它们需要您编写它们。