【问题标题】:(C++) Reading in a CSV file and creating objects with the information (that will become a linked list)(C++) 读取 CSV 文件并使用信息创建对象(将成为链表)
【发布时间】:2014-03-21 21:43:18
【问题描述】:

我正在尝试读取 csv 文件,然后使用读取的内容来创建对象。这些对象将形成一个链表。

当我在记事本中打开 csv 文件时,它看起来像这样:

姓名、地点 鲍勃史密斯,洛杉矶 乔·斯莫,纽约 通用名,凤凰

我想跳过第一行(名称、位置)并阅读其余部分。

现在我的代码如下所示:

ifstream File("File.csv");  

string name, location, skipline;

if(File.is_open())
{
    //Better way to skip the first line?
    getline(File, skipline, ',');
    getline(File, skipline);


    while (File.good())
    {
        getline(File, name, ',');


        getline(File, location);


        //Create new PersonNode (May not need the null pointers for constructor)
        PersonNode *node = new PersonNode(name, location, nullptr, nullptr);


        //Testing
        cout << node->getName() << " --- " << node->getLocation() << endl;

        //Add HubNode to linked list of Hubs (global variable hubHead)
        node->setNext(hubHead);
        hubHead = node;
    }
}
else
{
    cout << "Error Message!" << endl;
}

这似乎在大多数情况下都可以在文件中读取,但是有没有更好的方法来跳过第一行?此外,当文件被打印出来时,最后一列的第二行被复制,所以它看起来像这样:

输入:

姓名、地点 鲍勃史密斯,洛杉矶 乔·斯莫,纽约 通用名,凤凰

输出是:

鲍勃·史密斯 --- 洛杉矶 乔·斯莫——纽约 通用名称---凤凰 --- 凤凰

如果相关,对象的构造函数如下所示(将使用 OtherNode,因为将涉及另一个链表,但我还不担心)。

PersonNode::PersonNode(string name, string location, Node *next, OtherNode *head) { PersonNode::name = name; PersonNode::location = location; PersonNode::next = next; PersonNode::OtherNode = OtherNode; }

感谢您的帮助,非常感谢。

【问题讨论】:

  • 我不明白为什么您的 cout 语句不使用 std::endl 您似乎陷入了一些 C 约定。另外,看起来你的链表不需要知道下一个在构造时在哪里,或者头在哪里,那么为什么构造函数需要传入这些呢?你可以假设下一个将是nullptr,如果它在构建时总是如此。
  • 是的,我刚开始学习一点 C 语言。我有“使用命名空间 std;”我不知道我可以拥有不止一件这样的东西。所以,如果我有“std::endl”,我是否不需要使用转义字符 \n 或者我想我不太确定那是什么。至于构造函数,我明白你在说什么(我认为)。因此,在创建对象之后,我会有另一行代码将其实际添加到链表中?
  • 我从你的代码中了解到你正在使用命名空间std,但这并没有解决我评论的目的,即:你为什么使用 C 代码 && 你为什么复杂化对象构造?
  • C代码到底是哪一部分?应该如何改变? (对不起,这很新)。至于对象构造,我明白你在说什么(我认为)。因此,在创建对象之后,我会有另一行代码将其实际添加到链表中?
  • "\n" 是 C 换行符。 std::endlendl(如果您使用命名空间 std)是 C++ 的 endline 关键字。 std::cout 可以很好地处理字符串文字。您不必转换它们。

标签: c++ csv


【解决方案1】:

我认为您不需要getline(File, skipline, ','); 来跳过第一行。 因为getline(File, skipline); 已经跳过了第一行

来自(documentation)

(1) istream& getline (istream& is, string& str, char delim);
(2) istream& getline (istream& is, string& str);

从 is 中提取字符并将它们存储到 str 中,直到找到分隔符 delim(或换行符,'\n',用于 (2))。

您需要getline(File, skipline, ','); 才能在循环中获取值

【讨论】:

  • 很好,谢谢。我只需要getline(文件跳过线);。知道为什么我仍然会得到额外的 --- 最后是凤凰吗?
  • 嗯我不确定,但我的猜测是,在 csv 文件的最后,不知何故有一个额外的newline,所以while(File.good()) 仍然循环。你可以试试这个getline(File, location, '\n'); 而不是getline(File, location) 吗?如果这仍然是一个额外的 Phoenix,我最后的猜测是,由于 location 的最后一个值是 Phoenix,并且在 csv 文件的最后有这个额外的“换行符”,while 循环仍然继续,然后以某种方式显示最后一个值location 是 Phoenix,而 name 由于未知原因没有输出
猜你喜欢
  • 2021-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-07
  • 2018-08-08
  • 2020-07-31
相关资源
最近更新 更多