所以我正在尝试尝试将名字和姓氏添加到双链表中。 我有各种不同长度的文本文件,格式为“字符串,字符串”,并使用列表>存储我的数据。
我正在使用此代码:
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>
让我难以置信。
再次感谢您的帮助!
答案 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来“吃掉”换行符。