Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Programm multilangual auwahl

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: [ 1 ] > 2 <
010
12.08.2005, 08:44 Uhr
virtual
Sexiest Bit alive
(Operator)


@Skippy

dafür gibt es einfache Möglichkeiten, zB:

C++:
#include <map>
#include <iostream>
#include <string>
#include <cctype>
#include <fstream>

// Key-Value pair von Strings
typedef std::pair<std::string,std::string> str_pair_t;

// Map von configurations settings
typedef std::map<std::string,std::string> config_t;

// Überflüssige Leerzeichen entfernen
std::string trim(std::string value) {
    std::string::size_type start = 0;
    std::string::size_type end = value.length()-1;

    while (start<=end && isspace(value[start])) ++start;
    while (start<=end && isspace(value[end])) --end;

    value =value.substr(start, end-start+1);
    return value;
}

// Einlesen von key/value pairs
std::istream& operator >> (istream& in, str_pair_t& value) {
    std::string line;
    std::getline(in, line);

    if (in) {
        std::string::size_type pos = line.find_first_of('=');
        if(std::string::npos==pos) {
            value.first = trim(line);
            value.second = "";
        }
        else {
            value.first = trim(line.substr(0, pos));
            value.second = trim(line.substr(pos+1));
        }
    }
    return in;
}


int main() {
    std::ifstream in("test"); // Datei mit den settings
    config_t cfg; // Configuration

    // Einlesen der Datei
    while (in) {
        str_pair_t p;
        in>>p;
        if (in) cfg.insert(p);
    }
    // Ausgabe des inhalts
    for(config_t::const_iterator i=cfg.begin(); i!=cfg.end(); ++i) {
        std::cerr<<i->first<<" => \""<<i->second<<"\""<<std::endl;
    }
}


--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
011
12.08.2005, 10:37 Uhr
Th



Und Zugriff auf die Map ( O(log N) ) dann einfach über den Key, z.B.


C++:
const string &sValue = config_t["WARNUNG"];

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
012
12.08.2005, 15:51 Uhr
Skippy



@virtual die funktion selbst ist super als eigene exe funktioniert sie super

möchte daraus jetzt aber in eine funktion packen so dass in der main nur noch readinlanguage(english); steht

die funktion soll in die dateien Language.h und language.cpp

aber bekomme dabei probleme ich orientiere mich da an meine funktion readconfig

aber es kommen immer wieder die fehlermeldung value undeclared mit dem operator gibts auch probleme und isstream existiert angeblich auch nicht

ich tippe ja darauf das ich an der declaration noch was ändern muss oder fehlt in dem fall sogar was
?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
013
13.08.2005, 12:00 Uhr
Skippy



so hab mal weiter rumprobiert aber irgendwie komme ich da net hinter daraus ne funktion zu machen

mein problem
was bedeutet folgendes


C++:
std::istream& operator >> (istream& in, str_pair_t& value) {


und vorallem wo wird das aufgerufen


ich bekomme das auch nicht aus der main.cpp in die language.cpp

bekomme immer fehlermeldungen

ersten istream declared als non function

und dann das ein paar sachen nicht deklariert sind aber das hilft nicht weiter selbst wenn ich die sachen vorher nochmal deklariere kommt diese fehlermeldung

Dieser Post wurde am 13.08.2005 um 12:00 Uhr von Skippy editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
014
14.08.2005, 15:58 Uhr
Skippy



So habe mal versucht die Funktion nachzubauen

hier das ergebnis(funktioniert schonmal bestens)

zusätzlich werden in der funktion zeilen übersprungen die leer sind , per "#" auskommentiert wurden oder in denen der 2 wert fehlt

meine fragen dazu:

-kann man da sicherheitsmäßig noch etwas optimieren
-gibt es noch etwas was für die aufgabe der funktion sinnvoll wäre zu implementieren?
-und kann man geschwindigkeitsmäßig noch etwas optimieren
(berücksichtigt soll dabei auch das aufrufen der einzelnen elemente werden)


danke schonmal

kurz und bündig der header language.h



C++:
#ifndef __LANGUAGE_H__
#define __LANGUAGE_H__

#include <map>
#include <iostream>
#include <string>
#include <cctype>
#include <fstream>
#include <sstream>

using namespace std;                        // Use the standard namespace

// Map von Language Strings
typedef std::map<std::string,std::string> language_str;

void readinlanguage(char *LanguageFile);
#endif






und hier die language.cpp


C++:
void readinlanguage(char *LanguageFile)
{
    
      char LangFile[255];
      language_str lang_str; // Configuration

      sprintf(LangFile, "language/%s.txt", LanguageFile);
    

  std::ifstream inFile;
  inFile.open(LangFile);
  if (!inFile)
   {
      cout << "Datei " << LangFile << " kann nicht geoeffnet werden!" << endl;
      exit(1);
   }

   do
   {
      // Komplette Zeile aus der Datei
      string line;
      // Zu extrahierende 'Felder' aus der Dateizeile
      string LangName, LangValue;
      // Konvertierungsstream
      std::istringstream is;


      // Zeile einlesen
      getline(inFile,line);



      // Bei erreichen des Dateiendes den Rest ueberspringen
      if (inFile.eof())
         continue;//letzte zeile Überspringen Blödsinn muss entfernt werden
      // Eingelesene Zeile dem Konvertierungsstream zuweisen
      is.str(line);
      // Nun Name und Value aus der Zeile extrahieren
      getline(is,LangName,'=');                                         //   =
      getline(is,LangValue,';');                                          //    ;


        if(LangName == "") continue;
        if(LangValue == "") continue;
        if(LangName[0] == '#') continue;

  

      lang_str.insert(std::map<std::string,std::string>::value_type(LangName, LangValue));


   } while (!inFile.eof());

   // Datei wieder schliessen
   inFile.close();


    // Ausgabe des inhalts  zu  DEBUG zwecken
    for(language_str::const_iterator i=lang_str.begin(); i!=lang_str.end(); ++i) {
        std::cerr<<i->first<<" => \""<<i->second<<"\""<<std::endl;}

}


 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
015
15.08.2005, 10:05 Uhr
Th



Hallo Skippy,

werf das 'using namespace std;' bitte aus dem Header raus, in Source-Dateien kannst du es dann aber benutzen. Schau mal in der FAQ, warum.

Zu deiner Frage wegen dem >>-Operator. Dies ist die überladene Version für den Typ 'str_pair_t &' und wird in der main von "virtual" bei

C++:
  str_pair_t p;
  in>>p;


aufgerufen.

Bei seiner Definition hatte "virtual" ein "std::" vergessen, also

C++:
std::istream& operator >> (std::istream& in, str_pair_t& value)
{
  ...
}

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: [ 1 ] > 2 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: