Problem: jak wczytać zmienne do c++ znajdujące się w pliku tekstowym a następnie używać ich w programie?
Rozwiązanie: utworzyć klasę, która wczyta plik tekstowy, przydzieli każdą przetworzoną wcześniej linię do dynamicznej tablicy, której kluczem będzie nazwa zmiennej.
Wykorzystanie:
zawartość pliku "plik_konfiguracyjny.txt"
opcja1 wartosc1
opcja2 wartosc2
deklaracja klasy:
using namespace std;
#include <string>
#include "config.php"
inicjacja klasy:
config *opcje;opcje=new config("plik_konfiguracyjny.txt");
// lub
config opcje("plik_konfiguracyjny.txt");
odwołanie do konkretnej zmiennej:
opcje->v("opcja1");
// lub
opcje["opcja1"];
Kod klasy config.cpp
class config {
public:
struct rec {
public:
string name;
string v;
};
string operator[] (const string);
private:
string cfg_src;
rec *conf;
unsigned int conf_ile;
public:
config(string);
~config();
string v(string );
void add_tmp_config(string, string);
};
config::config(string _src="config.txt"){ //constructor
this->cfg_src = _src;
fstream cfg_file;
string _opcja,_val;
/* czy mozna otworzyc plik */
cfg_file.open(this->cfg_src.c_str(), std::ios::in);
if ( ! cfg_file.is_open() ) return;
if(cfg_file.bad() || !cfg_file.good() ) return;
/* ile linijek */
int licznik=0;
string dane; //smieci
while (!cfg_file.eof()) {
++licznik;
getline(cfg_file,dane);
} --licznik;
cfg_file.close();
/* zapisz wszystkie linie do tablicy */
if (licznik>0)
this->conf = new rec[licznik];
this->conf_ile = licznik;
if (licznik>0) { // sa rekordy
cfg_file.open(this->cfg_src.c_str(), std::ios::in);
for (unsigned int i=0;i<this->conf_ile;i++) {//foreach file
if (cfg_file.eof()) return;
cfg_file >> _opcja;
// _val moze byc puste - nie raportuj o koncu pliku
cfg_file >> _val;
this->conf[i].name = _opcja;
this->conf[i].v = _val;
} //foreach file
} // sa rekordy
} //constructor
//--------------------------------------------------------------------
string config::operator[] (const string _key) {
return this->v(_key);
}
//--------------------------------------------------------------------
void config::add_tmp_config(string _key, string _v){
if (_key.length()==0) return;
if (_v.length()==0) return;
rec *tmp_conf;
tmp_conf = new rec[(this->conf_ile+1)];
for (unsigned int i=0;i<this->conf_ile;i++) {//foreach file
tmp_conf[i].name = this->conf[i].name;
tmp_conf[i].v = this->conf[i].v;
} //foreach file
tmp_conf[this->conf_ile].name = _key;
tmp_conf[this->conf_ile].v = _v;
delete[] this->conf;
this->conf = tmp_conf;
++this->conf_ile;
}
//--------------------------------------------------------------------
string config::v(string _key) {
for (unsigned int i=0;i<this->conf_ile;i++) { //foreach file
if (this->conf[i].name == _key) {
return this->conf[i].v;
}
} //foreach file
return "";
}
//--------------------------------------------------------------------
config::~config(){
delete[] this->conf;
}
//--------------------------------------------------------------------
![[c++] config file – wczytywanie zmiennych z pliku tekstowego](/_next/image?url=https%3A%2F%2Fs3.c.kastin.pl%2Fwebowiec-net%2Fcover_c_config_file_wczytywanie_zmiennych_z_pliku_tekstowego_77baac3936.jpg&w=3840&q=75)

