Dringend Hilfe bei C Programm
Geizhals » Forum » Programmierung » Dringend Hilfe bei C Programm (14 Beiträge, 165 Mal gelesen) Top-100 | Fresh-100
Du bist nicht angemeldet. [ Login/Registrieren ]
.
Re: Dringend Hilfe bei C Programm
13.08.2004, 11:34:35
Na hoffentlich gehts jetzt besser ;-)

Falls die includes wieder nicht lesbar sind:

#include ctype.h
#include string.h
#include stdio.h
#include stdlib.h

jeweils mit spitzklammern um die *.h



#include
#include
#include
#include

/* Prototype */
void parsecfg(char *);

/*
erweitern um:
   - Definition einer struct instanz und Aufbauen eines Arrays/Liste
   - Besseres Fehlerreporting z.B. in welcher Zeile des Konfigfiles war ein Fehler
   - Überprüfen der Parameter auf Gültigkeit
      
*/

/* main */

int main(int argc, char **argv)
{
   char     inbuf [8192];  /* Maximal 8191 lange Zeilen lassen sich verarbeiten */
   char     *cfgfname;     /* Configfilename */
   FILE     *fp;           /* Filepointer fürs Konfigfile */
  
   /* Check usage */
   if (argc < 2) {
      fprintf(stderr, "Usage: %s configfile\n", argv[0]);
      exit(-1);
   }

   cfgfname = argv[1];
   if ((fp = fopen(cfgfname, "r")) == NULL)
   {
      fprintf(stderr, "Can't open configfile %s\n", cfgfname);
      exit(-1);
   }
  
   while (fgets(inbuf, 8191, fp))
   {
      parsecfg(inbuf);
   }

   fclose(fp);
}


/* parsecfg

   inputparameter:
   - char Array, das den Zeileninhalt enthält
  
   outputparameter:
   - keine

   Liest alle Zeilen des Konfigfiles ein,
   - überspringt Leerzeilen
   - überliest Kommentare
   - übernimmt Zeilen des Formats Instanz(p1,p2,p3)
   - gibt Fehlermeldung aus, wenn die Zeile nicht dem obigen Bedingungen entspricht

  

*/
  
void parsecfg(char *inbuf)
{
   char *inp;
  
   char  p1[8192];
   char  p2[8192];
   char  p3[8192];
   char  instanz[8192];
  
   char *s1, *s2;
   int   myerr = 0;
  
   inp = inbuf;
  
   /* Führende Whitechars entfernen */
   while (isspace (*inp))
   {
      inp ++;
   }
  
   /* Leerzeile? */
   if(*inp == (char)0)
   {
      return;
   }
  
   /* Prüfen, ob Kommentar */
   if (inp[0] == '/' && inp[1] == '/')
   {
      return;
   }
  
   /* erste Klammer ( suchen */
   if (! (s1 = strchr(inp, '(')))
   {
       fprintf(stderr, "Wrong syntax %s\n", inbuf);
       return;
   }
  
   /* Klammer zu suchen */
   if (! (s2 = strchr(s1, ')')))
   {
       fprintf(stderr, "Wrong syntax %s\n", inbuf);
       return;
   }
  
   /* s2 als Stringende kennzeichnen */
   *s2 = (char)0;
  
   /* instanz kopieren */
   strncpy(instanz, inp, s1 - inp);
   instanz[s1 - inp] = (char)0;
  
  
   /* Alternativen zur while Schleife mit zeichenweisem kopieren
      - beistriche suchen, siehe oben
      - sscanf verwenden
   */
  
   /* inp auf s1 setzen  */
   inp = s1;
  
   /* s1 auf das 1. Zeichen von p1 */
   s1 = p1;
  
   /* da *inp Klammer auf (  ist, interessiert uns erst das
      nächste Zeichen */
   while (*inp++)
   {
      /* Beistrich = ende */
      if (*inp == ',')
      {
         *s1 = (char)0;
         break;
      }
      
      /* Leerzeichen überlesen */
      if (isspace(*inp))
      {
         continue;
      }
      
      /* Zeichen kopieren */
      *s1 ++ = *inp;
   }
  
   /* Keine Zeichen gefunden! */
   if (s1 == p1)
   {
       fprintf(stderr, "1. Paramter not found %s\n", inbuf);
       return;
   }
  
   /* TODO: Parameter auf Gültigkeit prüfen */
  
   /* obiges für den 2. und 3.Parameter auch machen, daher am Besten die while-Schleife
      in eine eigene Funktion packen */
  
   printf ("Instanz: %s - %s\n", instanz, p1);

   return;    
}





Antworten PM Übersicht Chronologisch Zum Vorgänger
 
Melden nicht möglich
 

Dieses Forum ist eine frei zugängliche Diskussionsplattform.
Der Betreiber übernimmt keine Verantwortung für den Inhalt der Beiträge und behält sich das Recht vor, Beiträge mit rechtswidrigem oder anstößigem Inhalt zu löschen.
Datenschutzerklärung