从文本文件C ++加载值

时间:2012-11-07 03:03:58

标签: c++

我有一个名为settings.txt的文本文件。在里面我有它说:

Name = Dave

然后我打开文件并循环播放脚本中的行和字符:


    std::ifstream file("Settings.txt");
    std::string line;

    while(std::getline(file, line))
{
    for(int i = 0; i < line.length(); i++){
        char ch = line[i];

        if(!isspace(ch)){ //skip white space

        }

    }
}

我想要解决的是将每个值分配给某种变量,这些变量将被视为游戏的“全局设置”。

所以最终的结果是:

Username = Dave;

但是以这种方式我可以在以后添加额外的设置。我无法弄清楚你会怎么做= /

1 个答案:

答案 0 :(得分:2)

要添加额外设置,您必须重新加载设置文件。通过在std :: map中保持设置,可以添加新设置或覆盖现有设置。这是一个例子:

#include <string>
#include <fstream>
#include <iostream>

#include <algorithm>
#include <functional>
#include <cctype>
#include <locale>

#include <map>

using namespace std;

/* -- from Evan Teran on SO: http://stackoverflow.com/questions/216823/whats-the-best-way-to-trim-stdstring -- */
// trim from start
static inline std::string &ltrim(std::string &s) {
        s.erase(s.begin(), std::find_if(s.begin(), s.end(), std::not1(std::ptr_fun<int, int>(std::isspace))));
        return s;
}

// trim from end
static inline std::string &rtrim(std::string &s) {
        s.erase(std::find_if(s.rbegin(), s.rend(), std::not1(std::ptr_fun<int, int>(std::isspace))).base(), s.end());
        return s;
}

// trim from both ends
static inline std::string &trim(std::string &s) {
        return ltrim(rtrim(s));
}

int main()
{
    ifstream file("settings.txt");
    string line;

    std::map<string, string> config;
    while(std::getline(file, line))
    {
        int pos = line.find('=');
        if(pos != string::npos)
        {
            string key = line.substr(0, pos);
            string value = line.substr(pos + 1);
            config[trim(key)] = trim(value);
        }
    }

   for(map<string, string>::iterator it = config.begin(); it != config.end(); it++)
   {
        cout << it->first << " : " << it->second << endl;
   }
}