Problem beim einlesen von Dateien



  • Hallo,

    ich habe heute erst angefangen C zu lernen.
    Ich habe ein configfile, welches ich mit C einlesen möchte.
    Den Inhalt der Dazei möchte ich nach Zeilen aufspalten und wenn die Zeile mit "api_key " anfängt, möchte ich das, was dahinter steht, in der variablen api_key speichern.

    Leider funktioniert das nicht ganz:

    Der erste Output ist korrekt, der zweite ist leider leer.

    char *api_key = "test";
      char *uuid = "test";
      char *data = "test";
    
      char linebuffer[150];
    
      while(fgets(linebuffer, 150, configfile) != NULL) {
        if (string_starts_with("api_key ", linebuffer) == 1)
        {
          api_key = linebuffer;
          memcpy(api_key, &linebuffer[8], strlen(linebuffer) - 8);
          api_key[strlen(linebuffer) - 9] = '\0'; //We use 9 to overwrite the \n at the end
          remove_spaces(api_key);
    
          printf("API Key gefunden: %s\n", api_key);
        }
    
      }
    
      printf("Ende: %s\n", api_key);
    

    Wäre cool, wenn mir da ein profi helfen könnte.



  • - Zeile 10 ist Nonsens
    - Zeile 11 zeigt, dass du nicht weißt, was du berechnen willst, mind. liegt hier der Fehler vor
    - string_starts_with+remove_spaces sind kein Standard, kein Mensch kann wissen, was da passiert

    Wenn du whitespace-getrennte Substrings hast, ist es immer einfacher, sscanf zu nehmen (in Verbindung mit fgets), statt selbst irgendwas zusammenzubasteln, oder wenn man weiß was man tut (also keine Anfänger,Fachbuchautoren,Tutorialschreiberlinge,Hochschullehrer) nimmt man fscanf, in der Art

    char key[100],val[100];
    
    while( 2==fscanf(f,"%99s%99s%*[^\n]",key,val) )
    {
       printf("%s = %s\n",key,val);
       if( !strcmp(key,"api_key") )
         puts("gefunden");
    }
    


  • Hallo Wutz,

    danke für die schnelle Antwort.
    Wenn ich Zeile 10 weg gelassen haben, dann habe ich beim ausführen einen "Bus error" bekommen.

    Ich glaube ich habe jetzt auch verstanden, wieso:
    Zeile 11 hat, so wie ich das verstanden habe, versucht, einen read-only string (api_key) zu verändern.

    Ich habe es dank deines Snippets so zum Laufen bekommen:

    FILE *configfile = fopen("client.conf","r");
      if(configfile == NULL) {
        fprintf(stderr, "The config file could not be opened\n");
        return -1;
      }
    
      char key[100],val[100], api_key[100], uuid[100];
    
      while( 2==fscanf(configfile,"%99s%99s%*[^\n]",key,val) ) 
      {
         if( !strcmp(key,"api_key") ) { strcpy(api_key, val); }
         if( !strcmp(key,"uuid") )    { strcpy(uuid,    val); }
      }
    

    Ich habe in Zeile 11 und 12 strcpy benutzt, damit beim nächsten Schleifendurchlauf nicht die Speicheradresse, in dem der vorherige Wert liegt, überschrieben wird.

    Wäre der Code so in Ordnung?

    Viele Grüße



  • Der Code ist soweit OK (wenn auch unnötig C99), aber die Dynamik ist hier wichtig, d.h. bei Zeilen mit nur 1 Substring gibts Probleme, Leerzeichen am Zeilenbeginn werden unterdrückt, key+val dürfen nicht durch whitespace getrennt sein.


Anmelden zum Antworten