C++ 关于列表和对的混淆
所以我正在尝试将名字和姓氏添加到一个双链接列表中。 我有一个不同长度的文本文件,格式为“string,string”,我正在使用list>来存储我的数据 我正在使用以下代码:C++ 关于列表和对的混淆,c++,list,iterator,size,ifstream,C++,List,Iterator,Size,Ifstream,所以我正在尝试将名字和姓氏添加到一个双链接列表中。 我有一个不同长度的文本文件,格式为“string,string”,我正在使用list>来存储我的数据 我正在使用以下代码: typedef std::list< std::pair<string,string> > listPair; typedef std::listlistPair; 列出mylist; ifstreammyfile; myFile.open(“20.txt”); 配对材料; while(myF
typedef std::list< std::pair<string,string> > listPair;
typedef std::listlistPair;
列出mylist;
ifstreammyfile;
myFile.open(“20.txt”);
配对材料;
while(myFile>>stuff.first>>stuff.second)
{
我的列表。推回(东西);
}
listPair::iterator iter=mylist.begin();
对于(;iter!=mylist.end();iter++)
{
字符串s=(*iter);
ifstream上的coutOperator>>将换行符视为另一个标记。因此,它可能会按照正常方式从第一行读取第一个和第二个单词,但读取的第三个标记是第一行的新行
尝试使用getline来“吃”换行符。我感觉您的文件实际上没有您所描述的值之间的空格,所以它看起来像这样:
one,two
three,four
five,six
seven,eight
nine,ten
如果您要在此基础上运行程序,则列表的大小将为2(楼层(行数/2)
,您将给出48行),并且最后一行根本不会放在列表中。为什么
首先,对std::ifstream::operator>>(std::string&)
的每次调用都会提取到一些空格。在这种情况下,第一行的第一个空格是结尾处的\n
。因此在第一次迭代中,填充。第一个将是“一,二”
,然后下一行将被读入内容。第二行
,使其成为“三,四”
。然后将其推入列表
。下两行以相同的方式读取,给您一对{“五,六”,“七,八”}
。在下一次迭代中,第一个操作符将提取“九,十”
第二行将失败,导致while
状态结束,最后一行被丢弃
即使您确实有空格,也会在每个对的第一个中使用逗号,这肯定不是您想要的
解决此类问题的更好方法是使用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::字符串行;
std::对线对;
while(std::getline(myFile,line)){
std::stringstream line\u stream(线);
std::getline(line_stream,line_pair.first,',');
std::getline(行\流,行\对,秒);
mylist.push_back(线对);
}
我还建议使用std::vector
,除非你有充分的理由使用std::list
也许你正在寻找getline
?作为一个旁注,作为一个通用容器,你应该使用vector
,而不是list
。从你使用它的方式来看,我看不需要列表代码>这里。你能添加输入文件20.txt
(或至少一个摘录)吗?可能您的输入格式不正确。您的代码是正确的,但这并不说明输入格式不正确。也就是说,您的输入格式不正确。请尝试一个包含两个名称的文本文件,并向我们显示文本文件和结果。减小输入文件的大小,然后重试。如果仍然出现故障,则更容易跟踪wn。用两个条目和三个条目试试。提取器处理新行就像处理任何其他空白一样。如果你一直使用操作符>>
,你不必跳过它们。谢谢你,这正是我的问题,它工作得很好!天哪,每天都学点新东西哈哈
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);
}