我有一个文件,其中的地图条目由行分隔,键和值由':'分隔,如下所示:
一:1 二:2
三:3个
四:4
我在一个名为dict的ifstream中打开它,然后运行以下代码:
string key, value;
map< string, int > mytest;
while( getline( dict, key, ':' ).good() && getline( dict, value ).good() )
{
mytest[key] = atoi( value.c_str() );
}
有更好的方法吗?是否有getline功能可以从密钥中删除空格? (我试图在没有提升的情况下这样做。)
答案 0 :(得分:3)
是的,你可以简单地将冒号扔进垃圾变量
string key, colon;
int value;
while(cin >> key >> colon >> value)
mytest[key] = value;
这样,您应该确定冒号被空格分隔,并且您的密钥不包含任何空格。否则它将在键字符串中读取。或者你的部分字符串将被读作冒号。
答案 1 :(得分:2)
@Jonathan Mee:实际上你的帖子非常优雅(如果解析后的格式不匹配,你可能会遇到麻烦)。因此我的答案是:没有更好的方法。 1
修改强>
#include <iostream>
#include <map>
#include <sstream>
int main() {
std::istringstream input(
"one : 1\n"
"two : 2\n"
"three:3\n"
"four : 4\n"
"invalid key : 5\n"
"invalid_value : 6 6 \n"
);
std::string key;
std::string value;
std::map<std::string, int > map;
while(std::getline(input, key, ':') && std::getline(input, value))
{
std::istringstream k(key);
char sentinel;
k >> key;
if( ! k || k >> sentinel) std::cerr << "Invalid Key: " << key << std::endl;
else {
std::istringstream v(value);
int i;
v >> i;
if( ! v || v >> sentinel) std::cerr << "Invalid value:" << value << std::endl;
else {
map[key] = i;
}
}
}
for(const auto& kv: map)
std::cout << kv.first << " = " << kv.second << std::endl;
return 0;
}