Dynamische Anzahl an Ausgabedateien



  • Hallo!

    Für ein Programm möchte ich verschiedene CSV Dateien ausgeben lassen. Das Problem an der Sache ist aber, dass ich ja nicht weiß wieviele Dateien der User haben will.
    Mein bisheriger Ansatz ist folgender:

    FILE *CSV,*CSVOUT;
    
    // Anzahl der Ausgaben beim User nachfragen //
        int anz_ausgabe;
        printf("Bitte Anzahl an gewuenschten Ausgaben eingeben\n");
        scanf("%d", &anz_ausgabe);
    
     CSV = fopen (filename_input, "r");
     CSVOUT = fopen (filename_output, "w");
     while((fscanf(CSV,"%f;%f\n",&wert1,&wert2)) != EOF){
    	berechne(wert1,wert2);
    	fprintf(CSVOUT,"%f;%f;%f;%f\n",wert1,wert2,wert3,wert4);
    	}
    

    Die Dateinamen sind natürlich hinterlegt und das funktioniert auch alles. Nur soll jetzt der User entscheiden wieviele Ausgabedateien es geben soll und dafür habe ich noch keine Idee, wie ich das dynamisch gestalten kann (von einer Schleife mal abgesehen).

    Idee:

    int i;
    	for (i=0;i<anz_ausgabe;i++){
    		FILE *CSVOUT_i;
    		CSVOUT_i = fopen (filename_output_i, "w");
    	}
    

    Jetzt muss das _i nur irgendwie nummeriert werden.



  • neo_02 schrieb:

    ... Jetzt muss das _i nur irgendwie nummeriert werden.

    Dafür gibt es Arrays.

    Und wenn der Dateiname ansonsten gleich ist und sich nur dur die Nummer unterscheidet, kannst du den auch mit sprintf erzeugen.



  • Ich kann mithilfe Arrays Dateien erzeugen? Das ist ja fast wie Weihnachten 😃



  • Du brauchst nur Arrays, wenn du die Dateinamen alle zusammen brauchst.

    int i,anz_ausgabe;
    printf("Bitte Anzahl an gewuenschten Ausgaben eingeben\n");
    scanf("%d", &anz_ausgabe);
    
    for( i=1; i<=anz_ausgabe; ++i )
    {
      char filename_output[FILENAME_MAX];
      sprintf(filename_output,"%s%d","ausgabedatei.",i);
      {
        FILE *csvo = fopen (filename_output, "w");
        if( !csvo ) continue;
        while((fscanf(CSV,"%f;%f",&wert1,&wert2)) == 2)
        {
          berechne(wert1,wert2);
          fprintf(csvo,"%f;%f;%f;%f\n",wert1,wert2,wert3,wert4);
        }
        fclose(csvo);
      }
    }
    


  • Wenn ich dein Programm richtig verstanden habe, dann funktioniert das ganze so:

    Ich lese die Eingabedatei ein, berechne und gebe in neuer Datei aus.

    Und das ganze wiederhole ich so oft, wie der Benutzer eingegeben hat. Die Frage ist ob es nicht schneller wäre, wenn ich nach jeder Zeile der Eingabedatei in die verschiedenen Ausgabedateien schreiben würde. Denn mit einer einzelnen Datei läuft das Programm auf dem Desktop gut eine Stunde.



  • Das benötigt nur noch eine weitere Schleife (und natürlich nicht bei jeder Zeile der Lesedatei ein fopen der Ausgabedateien).



  • Danke euch allen!


Anmelden zum Antworten