【发布时间】: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::endl或endl(如果您使用命名空间 std)是 C++ 的 endline 关键字。std::cout可以很好地处理字符串文字。您不必转换它们。