关于列表和对的混淆

时间:2013-01-28 22:06:31

标签: c++ list iterator size ifstream

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

我正在使用此代码:

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? 这是因为我做了成对,这仍然没有意义,好像它不是成对阅读实际上会有两倍的约,因为对只是将名字和姓氏作为一个值。 / p>

让我难以置信。

再次感谢您的帮助!

2 个答案:

答案 0 :(得分:5)

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

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"。然后将其推入list。接下来的两行以相同的方式读取,为您提供{"five,six","seven,eight"}对。在下一次迭代中,第一个operator>>将提取"nine,ten",第二个将失败,导致while条件结束,最后一行将被丢弃。

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

解决此类问题的更好方法是使用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

答案 1 :(得分:-1)

运营商&gt;&gt;在ifstream上将换行视为另一个令牌。因此,它可能会从第一行开始按正常方式读取您的第一个和第二个单词,但读取的第三个标记是第一行的新行。

尝试使用getline来“吃掉”换行符。

相关问题