我有一个我想要读到地图的文件。
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;,但它们也不起作用。 任何人都可以帮忙吗?
答案 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();
。