对列表和对的混淆
confusion about lists and pairs
所以我正在尝试尝试将名字和姓氏添加到双链表中。我有各种不同长度的文本文件,格式为"字符串,字符串",并且正在使用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?是不是要做,因为我已经做了成对,这仍然没有意义,因为如果不成对阅读,实际上会有双倍的关于,因为对只是将名字和姓氏作为一个值。
令我难以置信。
再次感谢您的帮助!
我有一种感觉,你的文件实际上没有你所描述的值之间的空格,所以它看起来像这样:
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
条件结束并丢弃最后一行。
即使你确实有空格,你最终也会在每个pair
的first
中出现逗号,这当然不是你想要的。
解决此类问题的更好方法是使用 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
.
ifstream 上的运算符>>将换行符视为另一个标记。因此,它可能会正常地从第一行读取您的第一个和第二个单词,但读取的第三个标记是第一行的新行。
尝试使用 getline 来"吃掉"换行符。
- Pybind11:将元组列表从Python传递到C++
- 从链接列表c++中删除一个项目
- 如何(从固定列表中)选择一个数字序列,该序列将与目标数字相加
- C++如何通过用户输入删除列表元素
- 读取文件的最后一行并输入到链接列表时出错
- 复制列表初始化的隐式转换的等级是多少
- LNK2038、MSVS2017 MAGMA的原因列表
- 不能在初始值设定项列表中将非常量表达式从类型 'int' 缩小到'unsigned long long'
- 没有为自己的结构调用列表推回方法
- 使用简单类型列表实现的指数编译时间.为什么
- 一对向量构造函数:初始值设定项列表与显式构造
- 标准是否使用多余的大括号(例如 T{{{10}}})定义列表初始化?
- 通过for循环使用用户输入填充列表
- C++:如何使函数只返回作为列表一部分的字符串
- 概念中的cv限定符需要表达式参数列表
- 下面是我为检测链接列表中的循环而制作的代码
- 建议在运行时将带有类实例的列表从c++导入qml
- 如何维护资源管理器项目视图中当前可见的项目列表
- 在卡萨布兰卡形成编码参数的列表
- 在没有参数列表的情况下使用模板名称"Event"无效,模板问题