ineinander verschachtelte Dateien in der korrekten Reihenfolge lesen



  • Hallo!

    Wenn ich Daten, die in mehreren Dateien stehen (bei uns INCLUDE Dateien genannt) einlesen will, dann mache ich das prinzipiell so wie angegeben, wobei die Reihenfolge der eingelesenen Datensätze entscheidend ist!

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    int main( int argc, char* argv[] )  {
    FILE * File;
    FILE * File1;
    char Line[81];
    char Input[81];
    char* Token;
    int i;
    
    strcpy(Input,argv[1]);
    
    File = fopen(Input,"r");
    
    if (File){
      while (fgets(Line,80,File)){
        printf("%s",Line);
        if (strncmp(Line,"INCLUDE ",8) == 0){
          Token=strtok(Line,"'");
          Token=strtok(NULL,"'");
          File1 = fopen(Token,"r");
            while (fgets(Line,80,File1)){
              printf("%s",Line);
            }
          fclose(File1);
        }
      } 
    fclose(File);
    }else{
      printf("%s not found\n",Input);
    }
    return EXIT_SUCCESS;
    }
    

    Das klappt so aber nur für Dateien, die nur auf eine weitere INCLUDE-Datei verweisen (also nur eine zusätzliche Dateiebene haben).

    Was mache ich, wenn eine INCLUDE-Datei auf eine weitere verzweigt usw.?
    Muß ich da jedesmal eine eigene Einleseroutine programmieren?
    Die Verschachtelungstiefe ist nämlich prinzipiell unbegrenzt...

    Ciao

    OkkaPapa



  • Stichwort: Rekursion bzw. rekursive Funktion



  • Wenn Du das Einlesen raus aus der main() machst und in eine eigene Funktion, dann kannste das auch so machen, daß die Einlesefunktion sich selber bei #include-Teilen aufruft.



  • Hallo!

    Rekursiv war das Stichwort... habe ich zuletzt anno 86 oder so in TurboPascal gemacht...

    Mein Code sieht nun so aus:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    void read_include(char*);
    
    void read_include(char* Input){
    char Line[81];
    char* Token;
    FILE * File;
    FILE * File1;
    
    File = fopen(Input,"r");
    printf("opening %s\n",Input);
    
    if (!File){
      printf("%s not found here\n",Input);
      return;
    }
    if (File){
      while (fgets(Line,80,File)){
        printf("%s",Line);
        if (strncmp(Line,"INCLUDE ",8) == 0){
          Token=strtok(Line,"'");
          Token=strtok(NULL,"'");
          File1 = fopen(Token,"r");
          if (!File1){
            printf("%s not found here\n",Token);
            return;
          }
         read_include(Token);
         fclose(File1);
        }
      } 
    fclose(File);
    }
    return;
    
    }
    
    int main( int argc, char* argv[] )  {
    char Input[81];
    int i;
    
    strcpy(Input,argv[1]);
    
    read_include(Input);
    
    return EXIT_SUCCESS;
    }
    

    Einlesen klappt damit. Wenn Dateien fehlen steigt das Programm auch sauber aus.

    Eigentlich möchte ich aber die Interpretation der Einträge aus Line in main machen.

    Wir bekomme ich diese Einträge zurück ins Hauptprogramm? Oder geht das so gar nicht und ich brauche ein neues Konzept für meine Einlesestrategie?

    Ciao

    OkkaPapa



  • Sammeln in einem Array. Das kann die main() dann verarbeiten.

    Oder in eine temportäre Datei schreiben. Die kann die main() dann lesen.



  • Wofür sind die Zeilen 27-31 und 33 da.
    Machst du sowas auch in main?



  • DirkB schrieb:

    Wofür sind die Zeilen 27-31 und 33 da.
    Machst du sowas auch in main?

    Stimmt... die Zeilen können raus...

    Und was ich in main mache siehst Du da ja.

    Ciao

    OkkaPapa



  • volkard schrieb:

    Sammeln in einem Array. Das kann die main() dann verarbeiten.

    Oder in eine temportäre Datei schreiben. Die kann die main() dann lesen.

    Ich habe die Lösung mit dem Array (genauer mit einem struct) versucht.
    Leider ist der Index nach jedem Aufruf der Funktion wieder 0, so daß ich das Array immer nur mit den Daten aus dem aktellen Datensatz füttere.

    Wie gehe ich damit um?



  • Übergib den Index auch als Parameter an die rekusive Funktion (initial mit 0 starten).


Anmelden zum Antworten