Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » cfg file ala Apache

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 <
000
03.03.2005, 19:23 Uhr
FunnyDingo



Hallo zusammen,

ich habe eine Funktion geschrieben die eine Config-Datei ala Apache ausliest und die passende Werte Speichert. Hier der Code:


C++:
#define CFG_FILE_BUFFER 256

int load_cfg(char *cfg_file) {
  
  FILE *fd;
  char buffer[CFG_FILE_BUFFER], tok_buffer[CFG_FILE_BUFFER], key[CFG_FILE_BUFFER], value[CFG_FILE_BUFFER];
  extern cfg configuration;
  
  if (cfg_file == NULL) {
    printf("Please use name of config file as first option!\n");
    return -1;
  }
  
  fd = fopen(cfg_file, "r");
  if (fd == NULL) {
    printf("Can not open config file '%s'!\n", cfg_file);
    return -1;
  }
  
  while(fgets(buffer, CFG_FILE_BUFFER, fd) != NULL) {
    key[0] = '\0';
    value[0] = '\0';
    
    if (buffer[0] == '#')
      continue;
    
    sscanf(buffer, "%s %s", &key, &value);
    
    if (strcmp(key, "ServerRoot") == 0)
      strcpy(configuration.serverroot, value);
    
    if (strcmp(key, "Port") == 0)
      strcpy(configuration.port, value);
  }
  
  fclose(fd);
  return 0;
}


Hier noch das Struct cfg:

C++:
typedef struct cfg {
  char serverroot[255];
  char port[255];
} cfg;


Ich hätte nun zwei Fragen: a) Was haltet ihr als erfahrene C/C++-Programmierer davon und b) wie kann ich Leerzeilen und Zeilen deren erstes "nicht blank" ein # ist, ignorieren?

Wie ihr seht habe ich den Versuch mit dem # bereits gestartet, aber das klappt nur wenn es wirklich das erste Zeichen der Zeile ist und Leerzeichen schaffe ich gar nicht auszuschließen.

lg,


Funny
--
"Der Computer ist die logische Weiterentwicklung des Menschen: Intelligenz ohne Moral." (John James Osborne)

Meine Website: http://www.funnydingo.de

Dieser Post wurde am 03.03.2005 um 19:25 Uhr von FunnyDingo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
03.03.2005, 22:19 Uhr
(un)wissender
Niveauwart


Ehrlich?
Also erstens ist das C und kein C++. Zweitens macht man sowas eigentlich in XML. Aber zum Üben sicherlich geeignet.


Bearbeitung:

Filter einfach den Whitespace vor # raus. Dann ignorierst du nach # bis zum einem Newline-Zeichen alles.


--
Wer früher stirbt ist länger tot.

Dieser Post wurde am 03.03.2005 um 22:21 Uhr von (un)wissender editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
03.03.2005, 22:58 Uhr
FunnyDingo



Das das C ist weiß ich, hab ich den irgendwo was anderes gesagt? ;-)

Also Am Anfang einer Zeile kann sich ja ein blank oder \t befinden (oder habe ich eins vergessen?). Müsste doch eigentlich nur ne passende Schleife durchlaufen


C++:
...
laenge = strlen(buffer);
i=0;
while(buffer[i] == ' ' && buffer[i] == '\t') {
  /* Code zum entfernen des Zeichens */
  i++;
}


Nur wie kann ich das realisieren? Ich kenne C noch nicht so gut und bisher ist mir nichts bekannt mit dem ich das realisieren kann. Ich müsste ja jedes Zeichen rechts von dem ' ' bzw '\t' um eine Stelle nach links verschieben. Oder ich müsste die Datei zweichenweise einlesen und dort ' ' und '\t' vor dem ersten anderen Zeichen ausfilter, bzw. einfach nicht in den Buffer schreiben.
--
"Der Computer ist die logische Weiterentwicklung des Menschen: Intelligenz ohne Moral." (John James Osborne)

Meine Website: http://www.funnydingo.de
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
03.03.2005, 23:53 Uhr
Pablo
Supertux
(Operator)


Zum trimen (Leerzeichen löschen) kannst du das hier benutzen


C++:
#include <ctype.h>

char* ltrim(char* buffer)
{      
        if(!buffer)
                return NULL;

        while(isspace(*buffer))
                buffer++;
        
        return buffer;
}



wobei ltrim einen Zeiger auf das erste nicht blank-space setzt und den buffer-Inhalt nicht ändert.
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
04.03.2005, 07:17 Uhr
enno-tyrant
Frag nicht!



C++:
...
std::string String;
std::ifstream inFile(apache.datei);
...
do
{
    std::string line;
    std::getline(inFile,line);
    if (!inFile.eof())
    {
        if (((line[0] != '#') && (line.size() != 0)) || ((line[0] != ' ') && (line.size() != 0)))
        {
            String += line;
            String += '\n';
        }
    }
}
while (!inFile.eof());
...



so könnte es funktionieren
--
...um etwas zu verstehen muß man wissen wie es funktioniert...

Dieser Post wurde am 04.03.2005 um 07:18 Uhr von enno-tyrant editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
04.03.2005, 07:56 Uhr
(un)wissender
Niveauwart



Zitat von FunnyDingo:

Das das C ist weiß ich, hab ich den irgendwo was anderes gesagt? ;-)


Ja, mit diesem Satz

Zitat von FunnyDingo:

Was haltet ihr als erfahrene C/C++-Programmierer davon und [...]


hast du impliziert, man solle sich den Code auch unter C++-Aspekten ansehen.
OK, ist ein wenige Harspalterei, ich wollen nur sagen, warum ich das mit C erwähnt habe.
--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
04.03.2005, 08:37 Uhr
FunnyDingo




Zitat von Pablo:
[...]wobei ltrim einen Zeiger auf das erste nicht blank-space setzt und den buffer-Inhalt nicht ändert.


Das ist doch noch besser als den Inhalt zu verändern. In diesem Fall brauche ich das ja nur für strcmp(). Und wenn ich wirklich mal beides (die ganze Zeile sowie die getrimmte) benötige, kann ich vor dem ltrim die Adresse in einen anderen Zeiger kopieren. Da dort ja nur der Zeiger verschoben wird, kann ich auch davon ausgehen, dass dies ziemlich schnell ist.

Wenn ich nun noch ein rtrim bauen will, müsste ich aber wirklich den \0 um eine Stelle nach links verschieben, oder? Ohne zu testen würde ich die Funktion so aussehen lassen:


C++:
void rtrim(char *string) {
  int i;
  
  for(i=strlen(string) - 1; i<=0; i--) {
    if (isspace(buffer[i]))
      buffer[i] = '\0'
    else
      break;
  }
}


Und wegen dem "C/C++-Programmierer": schon okay, werde mich dann nächste mal etwas deutlicher ausdrücken ;-)
--
"Der Computer ist die logische Weiterentwicklung des Menschen: Intelligenz ohne Moral." (John James Osborne)

Meine Website: http://www.funnydingo.de

Dieser Post wurde am 04.03.2005 um 08:39 Uhr von FunnyDingo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
04.03.2005, 13:59 Uhr
Pablo
Supertux
(Operator)


bei rtrim muss du den Inhalt ändern, denn \0 muss nach links verschieben:


C++:
char* rtrim(char* buffer)
{
        size_t len;
        char* tmp;
        if(!buffer)
                return NULL;

        len = strlen(buffer);

        if(!len) return buffer;
                
        tmp = buffer + len - 1;
        
        while(isspace(*tmp) && (tmp != buffer))
        {
                *tmp = 0;
                tmp--;
        }
        
        *tmp = isspace(*tmp) ? 0 : *tmp;
        
        return buffer;
}


--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
04.03.2005, 15:00 Uhr
Th



Man kann aber auch strncmp benutzen und bei 2 Zeigern pLeftTrim, pRightTrim

C++:
strncmp(str, value, pRightTrim-pLeftTrim+1)


verwenden.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ 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: