Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.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++ 从文本文件加载std::map_C++_Map_Text Parsing - Fatal编程技术网

C++ 从文本文件加载std::map

C++ 从文本文件加载std::map,c++,map,text-parsing,C++,Map,Text Parsing,这是一件非常简单的事情,所以我想让它听起来尽可能简单。我只想从文件中加载一组键值对,并将它们填充到映射中。我并不真正关心文本的结构,只要它易于阅读 我现在得到的是: 带有xsd生成代码的xml(过度杀戮) 协议缓冲区(也包括overkill) INI样式文本文件 我喜欢INI文件的语法,但我不想为此编写解析器。在我看来,我会做很多人在我之前做过的事情。难道没有一种库可以读取像这样的简单结构化文件吗?既然你似乎想要最简单的东西,我将建议一些非常简单的东西,根据你的地图内容,它们可能有效,也可能

这是一件非常简单的事情,所以我想让它听起来尽可能简单。我只想从文件中加载一组键值对,并将它们填充到映射中。我并不真正关心文本的结构,只要它易于阅读

我现在得到的是:

  • 带有xsd生成代码的xml(过度杀戮)
  • 协议缓冲区(也包括overkill)
  • INI样式文本文件

我喜欢INI文件的语法,但我不想为此编写解析器。在我看来,我会做很多人在我之前做过的事情。难道没有一种库可以读取像这样的简单结构化文件吗?

既然你似乎想要最简单的东西,我将建议一些非常简单的东西,根据你的地图内容,它们可能有效,也可能无效。如果地图数据值是包含空格的字符串,则此操作无效。如果它们是不带空格的字符串或数字,则设置为

这不是经过测试的代码,但是它非常接近并且简单,所以即使它没有完全编译,您也应该很好。只需将KeyType和ValueType更改为int、string、float或您在文件中实际使用的任何内容

设置文件,如:

key value
key2 value2
key3 value3
key4 value4
读起来像:

KeyType key;
ValueType value;

std::map<KeyType, ValueType> myMap;
while (infile >> key >> value)
    myMap[key] = value;
keype键;
值类型值;
std::map myMap;
while(填充>>键>>值)
myMap[key]=值;

如果您在MS world,您可以使用

GetPrivateProfileSectionNames
GetPrivateProfileString
WritePrivateProfileString

从ini文件或注册表读取。如果要编写Unicode,请确保新创建的文件获得UTF16的BOM。

csv格式更简单,每行都是一对值,如:key;价值因此,键/值之间用分号分隔。我怀疑您是否会找到任何用于此的库(但可能存在一些库),因为解析它非常简单。可能是@gbjbaanb的重复,您是对的,csv也应该适用于我。但是,我仍然对标准INI格式的解析器感兴趣。。。函数从.ini文件中获取值。很容易做到。甚至比CSV(应该使用逗号而不是分号)更简单。在linux上,您需要一个非常简单的库!对我现在所做的一切都很有效。尽管如此,不是INI格式,但应该工作-1,循环条件应该是
,而(infle>>key>>value)
,对于循环体
myMap[key]=value
很简单基本的想法很好,但只是强调和解释Jonathan所说的:这不仅仅是一个风格问题,
eof()
条件是在一次失败的阅读尝试结束后才设置的(思想实验:即使不是
Infle
中的最后一个字符,它怎么能在
while()中知道呢)
它是否有足够的字符用于键和值?)。另外,和FWIW一样,这可以用于
std::string
键和带有空格的值,只需更改为
while(getline(infle,key)和&getline(infle,value))
。同意,没有考虑足够多-感谢您的建议,已经修改了答案。我喜欢Tony的想法,如果你真的要用它来表示多字字符串值。