【问题标题】:Is there a Way to Stream in a Map?有没有办法在地图中流式传输?
【发布时间】:2013-09-17 16:30:48
【问题描述】:

我有一个文件,其中映射条目由行分隔,键和值由“:”分隔,因此类似于:

一个: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 功能可以从键中删除空格? (我试图在没有提升的情况下做到这一点。)

【问题讨论】:

    标签: c++ map istream


    【解决方案1】:

    是的,您可以简单地将冒号放入垃圾变量中

    string key, colon;
    int value;
    
    while(cin >> key >> colon >> value) 
       mytest[key] = value;
    

    这样,您应该可以确保冒号由空格分隔,并且您的密钥不包含任何空格。否则它将在密钥字符串中读取。否则您的字符串部分将被读取为冒号。

    【讨论】:

    • 会失败:"one:" 变成键
    【解决方案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;
    }
    

    【讨论】:

    • 所以听起来剥离我的键值的最佳方法是添加:key.erase( remove_if( key.begin(), key.end(), isspace ), key.end() );,否则保持功能不变?
    猜你喜欢
    • 2021-02-19
    • 2021-08-31
    • 2011-01-27
    • 2011-07-17
    • 2021-02-23
    • 1970-01-01
    • 2019-08-13
    • 2018-02-09
    • 1970-01-01
    相关资源
    最近更新 更多