2017-08-10 71 views
-5

我有一個文件,我想讀入地圖。從文件讀取內容到地圖的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 

我也試過「地圖」和'地圖',但它們也不起作用。 任何人都可以幫忙嗎?

+2

你真的有'#'在你的源文件中,比如「'#### errors'」嗎? – genpfault

+1

@drescherjm他們是不同的圖書館,雖然C沒有在那裏使用。 – lilezek

+1

什麼是'inFile'?基本上,你在發佈之前沒有努力去解決這個問題。投票關閉印刷錯誤。 –

回答

2

我假設你沒有使用#作爲評論(因爲你必須使用//)。

我得到一個不同的錯誤比你:

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

模板map聲明正確,問題在註釋中。 #不作爲單行註釋在C++中使用//inFile.close();更改爲paramFile.close();

1
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>{}}; 
}