Mehrere Dateien nacheinander in einer Schleife öffnen?



  • Hallo Profis,

    eine Frage, ich würde gerne Dateien, deren Dateiname in einem String Array datenfile[i] stehen, nacheinander aufrufen und die erste Zeile auslesen. Bei der ersten Datei funktioniert das noch ganz gut. Bei der zweiten Datei stützt das Programm ab. Kann es sein, dass ich den File* Zeiger erstmal wieder freigeben muss oder sowas?
    Die Dateinamen sind richtig in dem Array abgelegt. Das habe ich schon überprüft.

    Vielen Dank für Eure Hilfe.

    Manuel

    for (i=0; i <=(anzahl-2); i++) {
              printf("%s\n",datenfile[i]);
              printf("%i\n",i);
            FILE* data = fopen(datenfile[i], "r"); //FILE immer alles gross
                  if (data == NULL) {
                    printf("Abbruch: Lesefehler Datenfile %s.\n\n", datenfile[i]);
                    system("PAUSE");	
                    return 0;
                    }
    
        fgets(buffer,20,data);
        printf("%s ",buffer);
    
        fclose(data);
    


  • Hast du mal im Debugger verfolgt, wo genau dein Programm abstürzt? Und hast du in deinem Puffer genug Platz für die Eingaben (andernfalls besteht die Gefahr, daß du dir beim fgets()-Aufruf den Speicher kaputtmachst).

    PS: eigentlich reicht der fclose()-Aufruf, um den Zeiger wieder freizugeben.



  • Vielen Dank schon mal für den Debugger - Tip.
    Ich benutze die IDE von DEC C++ und habe auch mit dem Debugger probiert. Wenn ich die Datei komplett ausführe, bleibt das Programm hängen. Wenn ich es im Debugger Schritt für Schritt ausführe, läuft die gewünschte Funktionalität ab. Könnte es daran liegen, wie schnell das Prog abläuft?
    Für Ideen wäre ich sehr dankbar.

    Manuel

    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    
    /*
      Name: Datensammler 0.1
      Copyright: open source
      Author: Manuel Behrens
      Date: 28.05.11 20:20
      Description: Dieses Programm soll Daten aus vorher festgelegten Dateien
      sammeln und als .CSV Datei ablegen.
      Es wird nur die erste Zeile in jeder Datei berücksichtigt.
      Language: Deutch
    */
    
    void chomp(char *str) {   
         size_t p=strlen(str);   
         /* '\n' mit '\0' überschreiben */   
         str[p-1]='\0';}
    
    int main(int argc, char *argv[])
    {
    
    // Deklaration
    
         // Konstanten
    const char ininame[] = {"sammler.ini"};
    const char csvname[] = {"sammler.csv"};
    const int laenge = 256;
    
          //Variable
    
    int anzahl, status, i;
    char datenfile[100][laenge];
    char buffer[20];
    char kopfzeile[256];
    char datenzeile[1000] = {""};
    
          //Aktuelle Zeit wird fürs Logfile ermittelt!
    
          // Initialisierung
    
        // Es werden die Dateinamen aus dem Inifile gelesen.  
    FILE* ini = fopen(ininame, "r"); //FILE immer alles gross
    if (ini == NULL) {
                printf("Abbruch: Lesefehler Konfigurationsdatei %s.\n\n", ininame);
                system("PAUSE");	
                return 0;
                }
    
    anzahl = 0;
    do{
       status = fgets(datenfile[anzahl],laenge,ini);
       anzahl++; }
       while (status != NULL);
    
    fclose(ini);
    
          printf("%i\n", anzahl);
    
          for (i=0; i <=(anzahl-1); i++) {
              chomp(datenfile[i]);
              printf ("%s \n", datenfile[i]); }
    
              // Die Kopfzeile der Datensammler CSV wird geschrieben.
    
    FILE* csvk = fopen(csvname, "w+"); //FILE immer alles gross
           if (csvk == NULL) {
                printf("Abbruch: Schreibfehler %s.\n\n", csvname);
                system("PAUSE");	
                return 0;
                }
    strcat(kopfzeile,"Datum/Uhrzeit;");
    for (i=0; i<=(100);i++) {
        strcat(kopfzeile,datenfile[i]);
        strcat(kopfzeile,";");}
    fputs(kopfzeile,csvk);
    fclose(csvk);
    
    // Hauptprogramm
    
       //Datum wird in die Datenzeile geschrieben.
    //strcat(datenzeile,ctime(&now);
    strcat(datenzeile,";");
    
       // Daten aus den Dateien auslesen.
    for (i=0; i <=(anzahl-2); i++) {
              printf("%s\n",datenfile[i]);
              printf("%i\n",i);
              printf("wurst2");
            FILE* data = fopen(datenfile[i], "r"); //FILE immer alles gross
                  if (data == NULL) {
                    printf("Abbruch: Lesefehler Datenfile %s.\n\n", datenfile[i]);
                    system("PAUSE");	
                    return 0;
                    }
    
        fgets(buffer,20,data);
        printf("\n%s ",buffer);
    
        fclose(data);
    
        strcat(datenzeile,buffer);
        strcat(datenzeile,";");
        printf("%s ",datenzeile);
        printf("wurst1");
    }
    
        //Zeile zusammensetzen!
    printf("wurst");
        //Dateinzeile wird in die CSV kopiert.
    FILE* csv = fopen(csvname, "w"); //FILE immer alles gross
        if (csv == NULL) {
                    printf("Abbruch: Schreibfehler %s.\n\n", csvname);
                    system("PAUSE");	
                    return 0;
                    }
    fputs(datenzeile,csv);
    fclose(csv);
    
       system("PAUSE");	
      return 0;
    }
    


  • Du hast vergessen, den Inhalt von kopfzeile zu initialisieren. Das kann im Debugger gut gehen, weil der alle neuen Variablen ausnullt, fliegt dir aber im produktiven Einsatz um die Ohren, wenn dort irgendwelche Mülldaten herumliegen (indbesondere wenn die nicht nullterminiert sind).
    Außerdem könnte es passieren, daß Kopfzeile zu klein wird für alle Dateinamen (in 256 Zeichen hast du Platz für für ca. 20 Dateien).



  • In Zeile 57 und 59 gibt der gcc Warnungen und der DMC Fehler ⚠

    Der gcc gibt noch weitere Warnungen.

    Kannst du das ein wenig übersichtlicher formatieren?

    Language: deutsch, german, allemand, tadesco
    

    😉

    MfG f.-th.



  • void erstezeilemehrererdateienineineandereschreiben(char **dateien,char *d)
    {
      FILE *x,*f=fopen(d,"a");
      if( !f ) return;
      while( *dateien )
      {
        if( x=fopen(*dateien++,"r") )
        {
          char z[100];
          if( fgets(z,100,x) )
            fprintf(f,"%s\n",((strchr(z,'\n')?*strchr(z,'\n')=0:0),z));
          fclose(x);
        }
      }
      fclose(f);
    }
    
    int main()
    {
      char *dateien[3]={"bla1.txt","bla2.txt"};
      erstezeilemehrererdateienineineandereschreiben(dateien,"bla3.txt");
      return 0;
    }
    

Anmelden zum Antworten