5

所以我正在尝试尝试将名字和姓氏添加到双链表中。我有各种不同长度的文本文件,格式为“字符串,字符串”,并且正在使用 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?是不是因为我已经完成了对,这仍然没有意义,就好像它不是成对阅读一样,实际上会有两倍的 about,因为这些对只是将名字和姓氏作为一个值。

让我难以置信。

再次感谢您的帮助!

4

2 回答 2

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

即使你确实有空格,你也会在firstevery中以逗号结尾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.

于 2013-01-28T22:43:45.057 回答
-1

ifstream 上的运算符 >> 将换行符视为另一个标记。因此,它可能会从您的第一行正常读取您的第一个和第二个单词,但读取的第三个标记是第一行的新行。

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

于 2013-01-28T22:17:03.140 回答