nahoy Skrevet 5. september 2005 Del Skrevet 5. september 2005 Hvordan kan man bruke en config-fil til å hente instillinger fra, dvs variabelverdier. Lenke til kommentar
Giddion Skrevet 7. september 2005 Del Skrevet 7. september 2005 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
Mr.Garibaldi Skrevet 7. september 2005 Del Skrevet 7. september 2005 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) Ville kanskje droppet 'b' hvis du vil at folk skal kunne editere filen selv, ala de fleste andre cfger... Lenke til kommentar
Giddion Skrevet 8. september 2005 Del Skrevet 8. september 2005 Ja det stemmer, hvis det er et mål burde man heller bruker printf og den tilsvarende lese funsjone. Lenke til kommentar
buskmann Skrevet 8. september 2005 Del Skrevet 8. september 2005 Det er sikkert også ferdige klasser for å lese ini-filer rundt omkring. Lenke til kommentar
hishadow Skrevet 8. september 2005 Del Skrevet 8. september 2005 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.0f2 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
nahoy Skrevet 8. september 2005 Forfatter Del Skrevet 8. september 2005 (endret) 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 8. september 2005 av nahoy Lenke til kommentar
hishadow Skrevet 8. september 2005 Del Skrevet 8. september 2005 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
Anbefalte innlegg
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 kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå