c++ - 对列表和对的混淆

标签 c++ list iterator size ifstream

所以我正在尝试尝试将名字和姓氏添加到双链表中。 我有各种不同长度的文本文件,格式为“string, string”,我正在使用 list> 来存储我的数据。

我正在使用这段代码:

typedef std::list< std::pair<string,string> > listPair;

...

list<pair<string, string> > mylist;
ifstream myFile; 
myFile.open("20.txt");

pair<string, string> stuff;
while (myFile >> stuff.first >> stuff.second)
{
    mylist.push_back(stuff);
}

listPair::iterator iter = mylist.begin();

for(;iter != mylist.end();iter++)
{
    string s = (*iter).first;
    cout << s << endl;
    string c = (*iter).second;
    cout << c << endl;
}

现在我遇到的问题是,首先,列表中的最后一项没有被添加。 就像每个文件都错过了结束行,所以这有点令人困惑。

此外,我正在执行“mylist.size()”以确保已添加所有名称,这让我感到困惑,因为对于包含 99 个名称的文本文件,即 99 行文本,它会说 (不要忘记由于缺少最后一行,它只读取 98)列表的大小为 48。

为什么是 48? 是不是因为我已经完成了成对的事情,这仍然没有意义,就好像它不是成对阅读一样,实际上会增加一倍,因为成对只是将名字和姓氏作为一个值。

让我难以置信。

再次感谢您的帮助!

最佳答案

我感觉你的文件实际上没有你描述的值之间的空格,所以它看起来像这样:

one,two
three,four
five,six
seven,eight
nine,ten

如果你要在上面运行你的程序,list 的大小将为 2(floor(number_of_lines/2),这对你来说是 48)最后一行根本不会被放入 list 中。为什么?

首先,对 std::ifstream::operator>>(std::string&) 的每次调用都将提取直到它遇到一些空白。在这种情况下,第一行的第一个空白是它末尾的 \n。所以在第一次迭代中,stuff.first 将是 "one,two" 然后下一行将被读入 stuff.second,使其成为 "three,four"。然后将其插入列表。接下来的两行以相同的方式读取,为您提供 {"five,six","seven,eight"} 对。在下一次迭代中,第一个 operator>> 将提取 "nine,ten",第二个将失败,导致 while 条件结束以及要丢弃的最后一行。

即使您确实有空格,您最终也会在每个 first 中使用逗号,这肯定不是您想要的。

解决此类问题的更好方法是使用 std::getline 提取一行,然后适本地解析该行:

std::string line;
std::pair<std::string, std::string> line_pair;
while (std::getline(myFile, line)) {
  std::stringstream line_stream(line);
  std::getline(line_stream, line_pair.first, ',');
  std::getline(line_stream, line_pair.second);
  mylist.push_back(line_pair);
}

我还推荐使用 std::vector 除非你有充分的理由使用 std::list

关于c++ - 对列表和对的混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14572128/

相关文章:

c++ - 为什么我的字符串第二次没有正确接受输入?

python - 拆分列表并根据唯一的值集创建分区(列表)

Python - 将元组列表转换为字符串

java - 迭代器困惑

c++ - 无法链接到 Windows 7 上的 Visual Studio 2013 中的 boost 1.60 线程库

c++ - 现代 OpenGL 2D 和 3D 绘图问题

c++学习 map 条目的顺序

c# 列出组合框中变量字符串中的所有出现情况

floating-point - 如何获取包含 float 的迭代器的最小值或最大值?

C++模板类迭代器错误