Gå til innhold

Hvordan hente verdier fra config-fil?


Anbefalte innlegg

Videoannonse
Annonse

Jeg vet ikke åssen variabler du skal skrive ha, men den enkleste måten er å skrive ut variablene med fwrite og lese de inn igjen med fread (husk rb mode i fopen)

hvis du skal ha det litt adv. så kan du jo bruke en array av strukt som denne.

 

int ID

int size;

char DATA[];

Du kan bruke ID til å kjenne igjen de forskjelige configurasjonene og plassen de skal.

Lenke til kommentar

Programkode som leser inn parvis <id, verdi>:

#include <fstream>

#include <iostream>

#include <map>

#include <string>

#include <sstream>

 

using namespace std;

 

 

typedef std::map<string, string> StringMap;

 

 

template <typename Type>

bool ConvertString(const string& data, Type& value)

{

    // Convert string to specified datatype.

    stringstream stream(data);

    stream >> value;

 

    if( stream.fail() )

        return false;

 

    return true;

}

 

void HandleConfiguration(StringMap& config)

{

    // Read some float values.

    StringMap::const_iterator search;

    float f1, f2, f3;

 

    search = config.find("f1");

    if( !ConvertString(search->second, f1) && search == config.end() )

        cout << "Unable to find value for f1" << endl;

 

    search = config.find("f2");

    if( !ConvertString(search->second, f2) && search == config.end() )

        cout << "Unable to find value for f2" << endl;

 

    search = config.find("f3");

    if( !ConvertString(search->second, f3) && search == config.end() )

        cout << "Unable to find value for f3" << endl;

 

 

    // Read some int values.

    int i1, i2;

 

    search = config.find("i1");

    if( !ConvertString(search->second, i1) && search == config.end() )

        cout << "Unable to find value for i1" << endl;

 

    search = config.find("i2");

    if( !ConvertString(search->second, i2) && search == config.end() )

        cout << "Unable to find value for i2" << endl;

 

 

    // Read some string values.

    string s1, s2;

 

    search = config.find("s1");

    if((s1 = search->second).empty() && search == config.end())

        cout << "Unable to find value for s1" << endl;

 

    search = config.find("s2");

    if((s2 = search->second).empty() && search == config.end())

        cout << "Unable to find value for s2" << endl;

 

 

    // Printout read values.

    cout << "debug printout:" << endl;

 

    cout << "f1 = " << f1 << endl;

    cout << "f2 = " << f2 << endl;

    cout << "f3 = " << f3 << endl;

 

    cout << "i1 = " << i1 << endl;

    cout << "i2 = " << i2 << endl;

 

    cout << "s1 = " << s1 << endl;

    cout << "s2 = " << s2 << endl;

}

 

 

int main(int argc, char* argv[])

{

    // Validate program arguments.

    if(argc != 2) {

        cout << "Missing program arguments." << endl;

        return -1;

    }

 

    const char* config_filename = argv[1];

 

    // Open configuration file.

    ifstream config_file( config_filename );

 

    if(!config_file) {

        cout << "Error opening " <<  config_filename << "." << endl;

        return -1;

    }

 

    // Read configuration from file.

    StringMap config;

 

    string id, value;

    while( !config_file.eof() ) {

        config_file >> id;

        config_file >> value;

 

        if(config_file.fail()) {

            cout << "Error while reading " << config_filename << "." << endl;

            cout << "Unable to parse id " << id << "." << endl;

            config_file.close();

            return -1;

        }

 

        config.insert( StringMap::value_type(id, value) );

    }

 

    config_file.close();

 

    // Handle configuration.

    HandleConfiguration(config);

 

    return 0;

}

 

Eksempelfil:

f1    1.0

f2    2.0

f3    3.0

i1    2

i2    4

s1    string_1

s2    string_2

 

Ulemper med koden slik den fungere nå:

- Alle id og verdier kan ikke inneholde whitespace.

- Konfigurasjonsfilen kan ikke avslutte med whitespace.

- Har ikke behandling av f.eks. kommentarer i konfigurasjonsfilen.

 

Alternativt kan du jo prøve å anvende XML, som vil gi deg langt større fleksibilitet.

Lenke til kommentar

Hei, testet koden, den virket fint, men da jeg skulle putte den i mitt eget program gikk det skeis.

 

// config-greier
using namespace std;
typedef std::map<string, string> StringMap;
template <typename Type>
//



class epler
{
     public:
            int x;
            int y;
            int verdi;
};
int antallepler=10;
epler eple[20];

 

Det står at: "`epler' does not name a type"

Og : "`type' has not been declared"

 

EDIT: Trykkleif

Endret av nahoy
Lenke til kommentar
Hei, testet koden, den virket fint, men da jeg skulle putte den i mitt eget program gikk det skeis.

 

// config-greier
using namespace std;
typedef std::map<string, string> StringMap;
template <typename Type>
//



class epler
{
     public:
            int x;
            int y;
            int verdi;
};
int antallepler=10;
epler eple[20];

 

Det står at: "`epler' does not name a type"

Og : "`type' has not been declared"

 

EDIT: Trykkleif

Slik du har koden nå, så blir det feil. Grunnen er at 'template <typename Type>' hører til deklarasjonen av funksjonen 'bool ConvertString(const string& data, Type& value)':

 

template <typename Type>

bool ConvertString(const string& data, Type& value)

{

...

}

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...