c ++如何读取cfg文件更复杂?

时间:2016-07-06 10:42:40

标签: c++

我最近从c#改为c ++。 我一直在看有关如何阅读配置文件的一些教程。我可能会问错了,我的意思是: 我正在制作一个程序,但它适用于多个用户。每个用户都会对文本文件中的内容产生影响。 例: 在我的文本文件中(" items.txt"),我有默认的" ints"和可配置的" ints"。

10=5
90=2
50=9

在c#中,如果我没记错的话,我会读取所有行,如果行以#34; 10 ="开头,我将文本拆分,这样我的行只能是可配置的int left和i可以在我的程序中轻松使用它,它类似于:

string[] lines = File.ReadAllLines(path);
string str;
foreach (string line in lines)
{
if (line.StartsWith("10"))
{
str = line.Split('=')[1];
//I have what i need (str);
}
}

我为我需要的一切做到了。那么,在c ++中最好的方法是什么?

另外:我需要为他们获取一个特定的行,所以我可以在以后的程序中使用它们。

提前多多感谢!

3 个答案:

答案 0 :(得分:0)

此代码是您发布的C#代码的C ++等效代码。这段代码本身就会编译,当然你必须为路径而不是空字符串填充。如果你需要在方法中的某个地方而不是作为程序本身,那么放弃 int main()返回0 当然。如果不清楚,请回复此问题。我尝试将其设置为与C#代码结构相同的方式,因此您可以理解所有内容。

boost-unit

答案 1 :(得分:0)

在C ++中,我们现在使用std::regex

对于您的情况 - 我使用以下内容:

#include <iostream>
#include <string>
#include <regex>
#include <iterator>

int main()
{
    // Simple config file
    std::string rules = "10=5\n  90=2\n50=9";

    std::regex single_rule_regex("[0-9]+\\=[0-9]+");
    std::regex single_rule_part_regex("[0-9]+");

    auto rules_begin = std::sregex_iterator(rules.begin(), 
                                            rules.end(), 
                                            single_rule_regex);
    auto rules_end = std::sregex_iterator();

    for (auto it = rules_begin; it != rules_end; ++it)
    {
        std::smatch rule_match = *it;
        std::string rule_str = rule_match.str();

        std::cout << rule_str << std::endl;

        // key=value
        auto parts = std::sregex_iterator(rule_str.begin(), 
                                          rule_str.end(), 
                                          single_rule_part_regex);
        std::string key = parts->str();
        std::string value = (++parts)->str();

        std::cout << key << " has " << value << std::endl;
    }
}

给定rules的输出是:

  

10 = 5
  10有5
  90 = 2
  90有2
  50 = 9
  50有9

答案 2 :(得分:0)

您的文件中有3件事:

  1. 行,我们可以使用getline
  2. 阅读
  3. 键(=之前的行的一部分)
  4. 值(=之后的部分)。

    我们可以通过找到=字符来分割键和值。

  5. 所以,你会得到类似的东西:

    std::ifstream file(path);
    if (!file) {
        std::cerr << "unable to open " << path << std::endl;
        return false;
    }
    
    for (std::string line; getline(file, line); ) {
        auto pos = line.find('=');
        if (pos == line.end()) {
            std::cerr << "skipping invalid line '" << line << "'\n";
            continue;
        }
        auto key = line.substr(0, pos);
        auto val = line.substr(pos);
        // do something with key,val
    }
    

    如果您想将上面的键和值字符串转换为int,您可以使用std::stringstream进行转换,或使用std::strtol