#ifndef CONFIG_H_
#define CONFIG_H_
class Config {
private:
static void update_config();
public:
static int initialize();
static const char* search(const char* parametr);
};
#endif /* CONFIG_H_ */
Config::search
. Он все нормально находит но только возвращает мусорные значения. Как это исправить?Config::search("title")
возвращает NAME
.#include "Config.h"
#include <iostream>
#include <fstream>
#include <string>
std::ofstream w_config;
std::ifstream r_config;
void Config::update_config() {
std::cout << "Create file Config" << std::endl;
w_config.open("Config.ini");
w_config << "title = NAME" << std::endl;
w_config << "window_mode = 0" << std::endl;
w_config << "width = 800" << std::endl;
w_config << "hight = 600" << std::endl;
w_config.close();
}
int Config::initialize() {
r_config.open("Config.ini");
if (!r_config.is_open()) {
std::cout << "Have not file Config.ini" << std::endl;
r_config.close();
update_config();
r_config.open("Config.ini");
}
if (!r_config.is_open()) {
std::cerr << "Failed open file Config.ini" << std::endl;
r_config.close();
return -1;
}
else {
std::cout << "Open file Config.ini" << std::endl;
r_config.close();
return 0;
}
}
const char* Config::search(const char* parametr) {
std::string str;
for (int a = 0; a < 2; a++) {
r_config.open("Config.ini");
std::cout << "Search in file Config.ini -> " << parametr;
while (!r_config.eof()) {
r_config >> str;
if (parametr == str) {
std::getline(r_config, str);
r_config.close();
str.erase(0, 3);
a = 2;
break;
}
else {
str = "";
}
}
if (str == "") {
r_config.close();
std::cout << " -> not found" << std::endl;
std::cout << "Re-";
update_config();
}
}
std::cout << " = " << str << std::endl;
return str.c_str();
}
#ifndef CONFIG_H_
#define CONFIG_H_
#include <string>
class Config {
private:
static void update_config();
public:
static int initialize();
static std::string search_str(std::string parametr);
static int search_int(std::string parametr);
static bool search_bool(std::string parametr);
};
#endif /* CONFIG_H_ */
#include "Config.h"
#include <iostream>
#include <fstream>
std::ofstream w_config;
std::ifstream r_config;
void Config::update_config() {
std::cout << "Create file Config" << std::endl;
w_config.open("Config.ini");
w_config << "title = NAME" << std::endl;
w_config << "window_mode = 0" << std::endl;
w_config << "width = 800" << std::endl;
w_config << "hight = 600" << std::endl;
w_config.close();
}
int Config::initialize() {
r_config.open("Config.ini");
if (!r_config.is_open()) {
std::cout << "Have not file Config.ini" << std::endl;
r_config.close();
update_config();
r_config.open("Config.ini");
}
if (!r_config.is_open()) {
std::cerr << "Failed open file Config.ini" << std::endl;
r_config.close();
return -1;
}
else {
std::cout << "Open file Config.ini" << std::endl;
r_config.close();
return 0;
}
}
std::string Config::search_str(std::string parametr) {
std::string str;
for (int a = 0; a < 2; a++) {
r_config.open("Config.ini");
std::cout << "Search in file Config.ini -> " << parametr;
while (!r_config.eof()) {
r_config >> str;
if (parametr == str) {
std::getline(r_config, str);
r_config.close();
str.erase(0, 3);
a = 2;
break;
}
else {
str = "";
}
}
if (str == "") {
r_config.close();
std::cout << " -> not found" << std::endl;
std::cout << "Re-";
update_config();
}
}
std::cout << " = " << str << std::endl;
return str;
}
int Config::search_int(std::string parametr) {
return stoi(search_str(parametr));
}
bool Config::search_bool(std::string parametr) {
return stoi(search_str(parametr));
}
return str.c_str();
std::string
. Или выделяйте char*
вручную, через new[]
(только не забудьте указатель потом удалить в вызывающем коде). Но лучше, конечно, возвращать string и не мучатся с ручным управлением указателями. #ifndef CONFIG_H_
#define CONFIG_H_
#include <string>
class Config {
private:
static void update_config();
public:
static int initialize();
static std::string search_str(std::string parametr);
static int search_int(std::string parametr);
static bool search_bool(std::string parametr);
};
#endif /* CONFIG_H_ */
#include "Config.h"
#include <iostream>
#include <fstream>
std::ofstream w_config;
std::ifstream r_config;
void Config::update_config() {
std::cout << "Create file Config" << std::endl;
w_config.open("Config.ini");
w_config << "title = NAME" << std::endl;
w_config << "window_mode = 0" << std::endl;
w_config << "width = 800" << std::endl;
w_config << "hight = 600" << std::endl;
w_config.close();
}
int Config::initialize() {
r_config.open("Config.ini");
if (!r_config.is_open()) {
std::cout << "Have not file Config.ini" << std::endl;
r_config.close();
update_config();
r_config.open("Config.ini");
}
if (!r_config.is_open()) {
std::cerr << "Failed open file Config.ini" << std::endl;
r_config.close();
return -1;
}
else {
std::cout << "Open file Config.ini" << std::endl;
r_config.close();
return 0;
}
}
std::string Config::search_str(std::string parametr) {
std::string str;
for (int a = 0; a < 2; a++) {
r_config.open("Config.ini");
std::cout << "Search in file Config.ini -> " << parametr;
while (!r_config.eof()) {
r_config >> str;
if (parametr == str) {
std::getline(r_config, str);
r_config.close();
str.erase(0, 3);
a = 2;
break;
}
else {
str = "";
}
}
if (str == "") {
r_config.close();
std::cout << " -> not found" << std::endl;
std::cout << "Re-";
update_config();
}
}
std::cout << " = " << str << std::endl;
return str;
}
int Config::search_int(std::string parametr) {
return stoi(search_str(parametr));
}
bool Config::search_bool(std::string parametr) {
return stoi(search_str(parametr));
}
std::optional<int>
. Тогда в вызывающем коде можно проверить, что int нашелся. В идеале, конечно, надо бы и все ошибки обробатвать. Если число не распарсилось, то надо выдать ошибку в лог и вернуть nullopt. config.search_int("foo").and_then(lambda);
. Код выходит довольно наглядный. std::optional<int>
о которых вы писали, но мне кажется это уже не так важно. В моём коде меня только смущает функция получения количества переменных lot_list()
так как она может вызываться несколько раз если несколько переменых неправильных. Я пробовал использовать sizeof(list)/sizeof(list[0]) но компилятор выдает ошибку: std::string []: недопустимый оператор sizeof.#ifndef CONFIG_H_
#define CONFIG_H_
#include <string>
class Config {
private:
static const int lot_list();
static std::string list[];
static void update();
public:
static int initialize();
static void rewrite(std::string parametr, std::string value = "");
static std::string search_str(std::string parametr);
static int search_int(std::string parametr);
static bool search_bool(std::string parametr);
};
#endif /* CONFIG_H_ */
#include "Config.h"
#include <iostream>
#include <fstream>
std::ofstream w_config;
std::ifstream r_config;
const int Config::lot_list() {
int i = 0;
while (!list[i].empty()) {
++i;
}
return i;
}
std::string Config::list[]{
"title = NAME",
"window_mode = 0",
"width = 800",
"hight = 600"
};
void Config::update() {
std::cout << "Create file Config.ini" << std::endl;
w_config.open("Config.ini");
for (int a = 0; a < lot_list(); a++) {
w_config << list[a] << std::endl;
}
w_config.close();
}
int Config::initialize() {
r_config.open("Config.ini");
if (!r_config.is_open()) {
r_config.close();
std::cout << "Have not file Config.ini" << std::endl;
update();
r_config.open("Config.ini");
}
if (!r_config.is_open()) {
r_config.close();
std::cerr << "Failed open file Config.ini" << std::endl;
return -1;
}
else if (r_config.peek() == EOF) {
r_config.close();
std::cout << "File Config.ini empty" << std::endl << "Re-";
update();
r_config.open("Config.ini");
}
if (!r_config.is_open()) {
r_config.close();
std::cerr << "Failed open file Config.ini" << std::endl;
return -1;
}
else {
r_config.close();
std::cerr << "Open file Config.ini" << std::endl;
return 0;
}
}
void Config::rewrite(std::string parametr, std::string value) {
std::cout << "Re-Create file Config.ini" << std::endl;
std::string str;
if (value == "") {
for (int a = 0; a < lot_list(); a++) {
str = list[a].substr(0, list[a].find_first_of(' '));
if (str == parametr) {
value = list[a];
break;
}
}
}
else {
value = parametr + " = " + value;
}
bool i = 1;
w_config.open("Config_copy.ini");
r_config.open("Config.ini");
while (!r_config.eof()) {
std::getline(r_config, str);
if (parametr == str.substr(0, str.find_first_of(' '))) {
w_config << value << std::endl;
i = 0;
}
else if (str == "") {}
else {
w_config << str << std::endl;
}
}
if (i) {
w_config << value << std::endl;
}
w_config.close();
r_config.close();
w_config.open("Config.ini");
r_config.open("Config_copy.ini");
while (!r_config.eof()) {
std::getline(r_config, str);
if (str == "") {}
else {
w_config << str << std::endl;
}
}
w_config.close();
r_config.close();
std::remove("Config_copy.ini");
}
std::string Config::search_str(std::string parametr) {
std::string str;
for (int a = 0; a < 2; a++) {
r_config.open("Config.ini");
std::cout << "Search in file Config.ini -> " << parametr;
while (!r_config.eof()) {
std::getline(r_config, str);
if (parametr == str.substr(0, str.find_first_of(' '))) {
r_config.close();
str.erase(0, parametr.length() + 3);
break;
}
else {
str = "";
}
}
if (str == "") {
r_config.close();
std::cout << " -> not found" << std::endl;
rewrite(parametr);
}
else {
break;
}
}
std::cout << " = " << str << std::endl;
return str;
}
int Config::search_int(std::string parametr) {
std::string int_str = Config::search_str(parametr);
char* ch;
strtol(int_str.c_str(), &ch, 10);
if (*ch) {
std::cout << "Not the corect value" << std::endl;
rewrite(parametr);
int_str = search_str(parametr);
}
return stoi(int_str);
}
bool Config::search_bool(std::string parametr) {
std::string bool_str = search_str(parametr);
if (bool_str == "0") {}
else if (bool_str == "1") {}
else {
std::cout << "Not the corect value" << std::endl;
rewrite(parametr);
bool_str = search_str(parametr);
}
return stoi(bool_str);
}
std::vector<std::string> Config::list[]
std::vector<std::string,std::allocator<std::string>>
"std::vector<std::string,std::allocator<std::string>>
" (или приемлемое преобразование отсутствует). В функции rewrite строчка value = list[a];std::vector<std::string,std::allocator<std::string>>
" (или приемлемое преобразование отсутствует). В функции update строчка w_config << list[a] << std::endl;std::vector<std::string,std::allocator<std::string>>
". В функции rewrite строчка str = list[a].substr(0, list[a].find_first_of(' '));std::vector<std::string,std::allocator<std::string>>
" та же строчка что в предыдущем пункте #ifndef CONFIG_H_
#define CONFIG_H_
#include <string>
#include <vector>
class Config {
private:
static std::vector<std::string> list;
static void update();
public:
static size_t lot_list();
static int initialize();
static void rewrite(std::string parametr, std::string value = "");
static std::string search_str(std::string parametr);
static int search_int(std::string parametr);
static bool search_bool(std::string parametr);
};
#endif /* CONFIG_H_ */
#include "Config.h"
#include <iostream>
#include <fstream>
std::ofstream w_config;
std::ifstream r_config;
size_t Config::lot_list() {
return list.size();
}
std::vector<std::string> Config::list{
"title = NAME",
"window_mode = 0",
"width = 800",
"hight = 600"
};
void Config::update() {
std::cout << "Create file Config.ini" << std::endl;
w_config.open("Config.ini");
for (int a = 0; a < lot_list(); a++) {
w_config << list[a] << std::endl;
}
w_config.close();
}
int Config::initialize() {
r_config.open("Config.ini");
if (!r_config.is_open()) {
r_config.close();
std::cout << "Have not file Config.ini" << std::endl;
update();
r_config.open("Config.ini");
}
if (!r_config.is_open()) {
r_config.close();
std::cerr << "Failed open file Config.ini" << std::endl;
return -1;
}
else if (r_config.peek() == EOF) {
r_config.close();
std::cout << "File Config.ini empty" << std::endl << "Re-";
update();
r_config.open("Config.ini");
}
if (!r_config.is_open()) {
r_config.close();
std::cerr << "Failed open file Config.ini" << std::endl;
return -1;
}
else {
r_config.close();
std::cerr << "Open file Config.ini" << std::endl;
return 0;
}
}
void Config::rewrite(std::string parametr, std::string value) {
std::cout << "Rewrite the parameter in file Config.ini" << std::endl;
std::string str;
if (value == "") {
for (int a = 0; a < lot_list(); a++) {
str = list[a].substr(0, list[a].find_first_of(' '));
if (str == parametr) {
value = list[a];
break;
}
}
}
else {
value = parametr + " = " + value;
}
bool i = 1;
w_config.open("Config_copy.ini");
r_config.open("Config.ini");
while (!r_config.eof()) {
std::getline(r_config, str);
if (parametr == str.substr(0, str.find_first_of(' '))) {
w_config << value << std::endl;
i = 0;
}
else if (str == "") {}
else {
w_config << str << std::endl;
}
}
if (i) {
w_config << value << std::endl;
}
w_config.close();
r_config.close();
w_config.open("Config.ini");
r_config.open("Config_copy.ini");
while (!r_config.eof()) {
std::getline(r_config, str);
if (str == "") {}
else {
w_config << str << std::endl;
}
}
w_config.close();
r_config.close();
std::remove("Config_copy.ini");
}
std::string Config::search_str(std::string parametr) {
std::string str;
for (int a = 0; a < 2; a++) {
r_config.open("Config.ini");
std::cout << "Search in file Config.ini -> " << parametr;
while (!r_config.eof()) {
std::getline(r_config, str);
if (parametr == str.substr(0, str.find_first_of(' '))) {
r_config.close();
str.erase(0, parametr.length() + 3);
break;
}
else {
str = "";
}
}
if (str == "") {
r_config.close();
std::cout << " -> not found" << std::endl;
rewrite(parametr);
}
else {
break;
}
}
std::cout << " = " << str << std::endl;
return str;
}
int Config::search_int(std::string parametr) {
std::string int_str = Config::search_str(parametr);
char* ch;
strtol(int_str.c_str(), &ch, 10);
if (*ch) {
std::cout << "Not the corect value" << std::endl;
rewrite(parametr);
int_str = search_str(parametr);
}
return stoi(int_str);
}
bool Config::search_bool(std::string parametr) {
std::string bool_str = search_str(parametr);
if (bool_str == "0") {}
else if (bool_str == "1") {}
else {
std::cout << "Not the corect value" << std::endl;
rewrite(parametr);
bool_str = search_str(parametr);
}
return stoi(bool_str);
}