Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 关于列表和对的混淆_C++_List_Iterator_Size_Ifstream - Fatal编程技术网

C++ 关于列表和对的混淆

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

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

我正在使用以下代码:

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);
}