所以我正在尝试尝试将名字和姓氏添加到双链表中。 我有各种不同长度的文本文件,格式为“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/