【问题标题】:Reading in a .csv file and storing values into vector and struct c++读取 .csv 文件并将值存储到 vector 和 struct c++
【发布时间】:2016-08-03 03:14:14
【问题描述】:

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

读取 .csv 文件,其中每一行的结构如下:“用户名,gpa,年龄”。将这些值存储到带有用户名、gpa 和年龄(字符串、浮点数、整数)的结构中,并创建一个列表作为向量。当您阅读每一行时,插入按用户名排序的向量列表。然后循环并打印出格式为“username [gpa] age:#”的列表,例如“mark [3.9] age:19”,并将输出写入文件(使用 C++,而不是 Unix)。

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

【问题讨论】:

  • 您可以根据需要创建结构向量。
  • 在 C++ 结构中 (struct) 与类 (class) 没有什么不同。两者都可以有成员变量。至于读取文件,std::getline 函数可以帮助读取文件和解析每一行。
  • 问题要求你构建一个包含用户名、gpa 和年龄字段的结构。这个结构的向量是可能的。
  • 你能举个例子说明你会如何编码吗?我不是在寻找答案,但我需要一个起点,我不知道如何开始这个问题。谢谢。
  • 在我看来你更需要a good beginners book

标签: c++ csv vector struct


【解决方案1】:

好吧,听上去,问题是要你读取文件,将信息放入一个结构体中,然后按照名称的字母顺序将结构体插入到向量中。

我会让结构类似于:

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

然后我会打开文件并将整个内容读入一个字符串。然后我会通读字符串,用换行符对其进行标记。当我得到每个字符串时,我会将它放入一个解析它并返回一个struct 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

print 函数和 sort 函数很容易解释,不过它们需要你自己编写。

【讨论】:

  • 非常感谢!!我完全明白你在说什么,我什至没有考虑使用 substr。
  • 别担心,很高兴我能帮上忙 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-08
  • 2016-10-30
  • 1970-01-01
  • 2021-10-06
相关资源
最近更新 更多