我是C ++编程的新手,我正在尝试做一个练习题,但我真的不明白它是什么让我去做,因为一个向量只能容纳一种数据类型(除非它可以容纳更多):
读入.csv文件,其中每一行的结构如下:“username,gpa,age”。将这些值存储到包含username,gpa和age(string,float,int)的结构中,并将列表创建为向量。当您在每行中读取时,插入按用户名排序的向量列表。然后循环并打印出格式为:“username [gpa] age:#”的列表,例如“mark [3.9] age:19”,并将输出写入文件(使用C ++,而不是Unix)。
我是否应该将所有这些值放在与单独数据类型相同的向量中,或者将它们全部保存在一个字符串中然后插入它们?如何将这些值存储到结构中?如果有人能告诉我他们将如何解决这个问题,并给我一些非常好的示例代码,谢谢。
答案 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
打印功能和排序功能非常自我解释,但它们需要您编写它们。