Hilfe komme im Code nicht weiter



  • Im Rahmen eines Praktikums sollen wir einen Programmcode schreiben mit dem man eine Datei die mehrere Werte besitzt, die jeweils durch ein Semikolon von einander getrennt sind in Spalten (Die Datei besitzt mehrere Messpunkte, ein Messpunkt hat ca. 60 Werte (abgetrennt durch semikolon) und diese Messpunkte sind untereinander gereiht. Die Werte haben am Ende ein V, das wird im Programmcode durch ein Lehrzeichen ersetzt. Da unser bisheriges Programm die Ausgabe Datei so oft öffnet und schließt wurden wir gebeten, die Daten jeweils in ein Arry zu schreiben und dann am Ende einmal die Werte in die Output Datei schreiben und einmal schleißen.
    Da ich zum ersten mal mit C programmiere komme ich nicht so recht weiter und wäre für jede Hilfe dankbar 😃

    Aaron Schneider

    PS: Hier mein Code:

    // ouput einlesen und anzeigen
    #include <stdio.h>
    #include <string.h>
    
    int main ()
    {           
    FILE *f;
    char file_name[255];
    char daten[1600];
    char zeichen;
    int zaehler;
    int az;
    char delimiter[] = ";";
    char *ptr;
    char var[50];
    char dateiname[50];
    int zeilenzaehler;
    int  i;
    FILE *g;
    
    f = fopen("C://Borland//Dauertest-Auswertung//output-bis-24.05.12.txt", "r");
    if(f == NULL)
    {
    printf("Konnte %s nicht oeffnen\n", file_name);
    
    }
    
    while( fgetc(f) != EOF)
    {
    zaehler = 0;
    do
    {
    	zeichen = fgetc(f);
    	daten[zaehler] = zeichen;
    //	fputc(zeichen, stdout);
    	zaehler++;
    //printf(" %i",zaehler);
    
    }
    while( zeichen != 10  );
    daten[zaehler] = 0;
    printf(" %i",zaehler);
    //printf("%s",daten);
    
    // initialisieren und ersten Abschnitt erstellen
    ptr = strtok(daten, delimiter);
    
    az=0;
    while(ptr != NULL)
    {
    az++;
    sprintf(var, "%s" ,ptr);
    // naechsten Abschnitt erstellen
    ptr = strtok(NULL, delimiter);
    
    i = strcspn (var,"V");
    var [i]= 0;
    //printf("%i.Abschnitt gefunden: %s\n" ,az,var);
    sprintf(dateiname, "C://Borland//Dauertest-Auswertung//Auswertung2405//%i.txt" , az);
    g = fopen(dateiname, "a");
    fprintf (g,"%s\n",var);
    fclose(g);
    //printf ("%s", dateiname); 
    
    }
    
    }
    fclose(f);
    scanf("%s",var);
    return 0;
    }
    


  • Speed4Life schrieb:

    Die Werte haben am Ende ein V, das wird im Programmcode durch ein Lehrzeichen ersetzt.

    Lehrzeichen?
    Leerzeichen!
    Und das meinst du wahrscheinlich auch anders, da du '\0' implementiert hast, Leerzeichen wäre aber ' '.

    Derzeit wird ja jeweils für jede Meßwertspalte eine Datei erzeugt, d.h. du hast u.U. 60 Dateien.
    Soll das so bleiben?
    Wenn nein, und du sowieso alles wieder in eine Datei rückschreiben willst, wie sollen die Werte eines Meßpunktes getrennt werden? Auch wieder mit ';'? Dann wäre die Arbeit sehr sehr einfach und sehr kurz.



  • Nein der soll in mehreren Dateien bleiben aber halt diese Dtaeien jeweils nur einmal öffnen und schließen und nicht zigmillionen mal, da das ausführen sonst zu lange dauert.
    Also soll er das einmal in einem Array einlesen und nachher weitergeben an die einzelnen Dateien


  • Mod

    Es wird doch derzeit jede Datei nur einmal geöffnet.

    (Falls ich gerade eine Schleife übersehe, die zigmillionenmal läuft, dann ist dies deiner nicht vorhandenen Einrückung zu verdanken. In diesem Fall öffne die Dateien im Scope um diese Schleife und halte dir die FILE* zu den Dateien in einem Array.)

    edit: Nach 5x durchgucken, sehe ich diese Schleife. Rück deinen Code ein! Mein Tipp für diesen Fall bleibt bestehen. Da die Anzahl der Dateien sich in jedem Durchlauf zu ändern scheint, musst du auch das Dateiarray bei Bedarf dynamisch vergrößern (malloc, realloc).



  • Ich habe keine Ahnung wie das Programm im kleinen funktioniert aber ich habe nochmal versucht alles einzurücken. Ich glaube aber, dass er aktuell für die Zeile jewils die Dateien öffnet und schließt und dann an die nächste Zeile geht und wieder das gleiche macht. Dadurch (Datei hat 50000 Zeilen) dauert der ganze Vorgang ziemlich lange

    // ouput einlesen und anzeigen
    #include <stdio.h>
    #include <string.h>
    
    int main ()
    {          
    FILE *f;
    char file_name[255];
    char daten[1600];
    char zeichen;
    int zaehler;
    int az;
    char delimiter[] = ";";
    char *ptr;
    char var[50];
    char dateiname[50];
    int zeilenzaehler;
    int  i;
    FILE *g;
    
    f = fopen("C://Borland//Dauertest-Auswertung//output-bis-24.05.12.txt", "r");
    if(f == NULL)
    {
      printf("Konnte %s nicht oeffnen\n", file_name);
    
    }
    
    while( fgetc(f) != EOF)
    {
      zaehler = 0;
    do
    {
        zeichen = fgetc(f);
        daten[zaehler] = zeichen;
        zaehler++;
    }
    while( zeichen != 10  );
    daten[zaehler] = 0;
    printf(" %i",zaehler);
    ptr = strtok(daten, delimiter);
    az=0;
    while(ptr != NULL)
    {
      az++;
      sprintf(var, "%s" ,ptr);
      ptr = strtok(NULL, delimiter);
      i = strcspn (var,"V");
      var [i]= 0;
      sprintf(dateiname, "C://Borland//Dauertest-Auswertung//Auswertung2405//%i.txt" , az);
      g = fopen(dateiname, "a");
      fprintf (g,"%s\n",var);
      fclose(g);
    }
    
    }
    fclose(f);
    scanf("%s",var);
    return 0;
    }
    


  • Ungetestet und ohne Fehlerbehandlung/Überlaufsprüfung/dyn. Speicherbelegung:

    #include <stdio.h>
    #include <string.h>
    #include <assert.h>
    
    #define ZEILEN 100000
    #define SPALTEN 100
    #define WERT 20
    #define SPALTENW (SPALTEN*WERT)
    
    int main()
    {
    static char array[ZEILEN][SPALTEN][WERT];          
    char *ptr;
    int  i,j,z=0;
    char zeile[SPALTENW];
    char *muster="C:/Borland/Dauertest-Auswertung/Auswertung2405/%i.txt";
    char fname[FILENAME_MAX]="C:/Borland/Dauertest-Auswertung/output-bis-24.05.12.txt";
    FILE *f = fopen(fname, "r");
    if(f == NULL)
      return perror(fname),1;
    
    /* eine Zeile aus Datei lesen und in eine Zeile in array umwandeln, mit Separator ';' */
    while( fgets(zeile,SPALTENW,f) )
    {
      assert( strchr(zeile,'\n') ); /* wurde ganze Zeile gelesen? */
      for( i=0,ptr=strtok(zeile,";");i<SPALTEN&&ptr;ptr=strtok(0,";"),++i )
        strcpy(array[z][i],((strchr(ptr,'V')?*strchr(ptr,'V')=0:1),ptr));
      ++z;
    }
    fclose(f); /* array wurde befüllt */
    
    /* array-Ausgabe pro Spalte in jeweils eine Datei */
    for(i=0;i<SPALTEN;++i)
    {
      f=fopen((sprintf(fname,muster,i),fname),"w");
      for(j=0;j<z;++j)
        fprintf(f,"%s\n",array[j][i]);
      fclose(f);
    }
    return 0;
    }
    


  • Vernüntig Einrücken bedeutet z.B. nach jeder { den Code 2 (bis 😎 Spalten weiter einzurücken.
    Nach eine } wird die Einrückunstiefe wieder um den selben Wert zurückgenommen.

    Also, nach jedem if, else, for, while, do und nach einem Funktionskopf (z.B. main) rückst du den Code weiter ein.
    Bis Zeile 33 klappt das auch noch.

    In Zeile 55, 57 und 61 hast du drei } hintereinander in der seben Spalte, ohne das da eine { zwischen ist. Zu welcher { gehöhren jetzt diese Klammern?

    Es gibt sogar einen Wikipedia-Artikel darüber: http://de.wikipedia.org/wiki/Einr%C3%BCckungsstil

    Und schau dir an, wie wutz das if(f == NULL) gelöst hat.
    Du machst da nämlich munter weiter willst dann immer noch aus der Datei lesen.


Anmelden zum Antworten