C ++将文件中的内容读入地图

时间:2017-08-10 21:04:00

标签: c++

我有一个我想要读到地图的文件。

file.txt
temperature 55
water_level 2
rain        10
........

虽然我知道我可以使用C函数' sscanf'解析数据。我更喜欢用C ++(我只习惯语言)并将其读入地图(第一列作为键,第二列作为值)。

我尝试过如下:

#include <iostream>
#include <sstream>
#include <fstream>
#include <string>
#include <stdio.h>
#include <string.h>
#include <map>
using namespace std;

int main(){
    const char *fileName="/home/bsxcto/Wedeman_NucPosSimulator/test/params.txt";
    ifstream paramFile;
    paramFile.open(fileName);
    string line;
    string key;
    double value;
    map <string, int> params; #### errors
    while ( paramFile.good() ){
        getline(paramFile, line);
        istringstream ss(line);
        ss >> key >> value; # set the variables  
        params[key] = value; # input them into the map 
    }
inFile.close();
return 0;
}

然而,在地图结构的初始化中我得到了一堆错误:

Multiple markers at this line
    - ‘value’ cannot appear in a constant-
     expression
    - ‘key’ cannot appear in a constant-expression
    - template argument 2 is invalid
    - template argument 1 is invalid
    - template argument 4 is invalid
    - template argument 3 is invalid
    - invalid type in declaration before ‘;’ token

我也试过了地图&#39;并且&#39;映射&#39;,但它们也不起作用。 任何人都可以帮忙吗?

3 个答案:

答案 0 :(得分:3)

我假设您没有使用#作为评论(因为您必须使用//)。

我得到了与你不同的错误:

prog.cpp:24:1: error: ‘inFile’ was not declared in this scope

修复后,我没有编译错误。

顺便说一下,这段代码:

map <string, int> params; // errors
while ( paramFile.good() ){
    getline(paramFile, line);
    istringstream ss(line);
    ss >> key >> value; // set the variables  
    params[key] = value; // input them into the map 
}

可以改写为:

map <string, int> params; // errors
while ( paramFile >> key >> value ) {
    params[key] = value; // input them into the map 
}

在此代码段中,( paramFile >> key >> value )在尝试读取密钥和值后paramFile为好时评估为真。

答案 1 :(得分:2)

struct kv_pair : public std::pair<std::string, std::string> {
    friend std::istream& operator>>(std::istream& in, kv_pair& p) {
        return in >> std::get<0>(p) >> std::get<1>(p);
    }
};

int main() {
    std::ifstream paramFile{"/home/bsxcto/Wedeman_NucPosSimulator/test/params.txt"};
    std::map<std::string, std::string> params{std::istream_iterator<kv_pair>{paramFile},
                                              std::istream_iterator<kv_pair>{}};
}

答案 2 :(得分:1)

模板map声明是正确的,问题出在评论中。在{c + + #中,//不用作一行注释。 inFile.close();更改为paramFile.close();