我最近从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 ++中最好的方法是什么?
另外:我需要为他们获取一个特定的行,所以我可以在以后的程序中使用它们。
提前多多感谢!
答案 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件事:
getline
=
之前的行的一部分)值(=
之后的部分)。
我们可以通过找到=
字符来分割键和值。
所以,你会得到类似的东西:
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
。