Zeilenanzahl in externen Datei



  • Hi,

    ich habe ein trainingsprogramm für mein Billardspiel geschrieben, am ende jeder trainingseinheit schreibt er die ergebnisse in eine externe Datei:

    fprintf(datei, "%s, %s, %i, %.2lf\n", sp.cName,sp.cArt,sp.iGes,sp.dSnt);
    

    Nun wird diese Datei natürlich im Laufe der Zeit immer größer. Ich will eine Variable haben die die anzahl der Zeilen, sprich Datensätze, beinhaltet.

    Mein gedanke war das ich einfach am anfang der Datei eine Zahl stehen habe die genau diese Anzahl angibt, aber an der umsätzung haperts, denn ich müsste immer erst die Zahl am anfang ändern und dann erst ans ende der datei gehen um dort die neu8en datensätze hinzuzufügen...

    hoffe mir kann hier einer helfen, vllt auch ne andere Idee hat.

    mfg Reficul



  • Jo, du kannst doch mit fseek immer an den Anfang und an das Ende der Datei gelangen, zeig mal ein bisschen Code...



  • void Trainingsprogramm()
    {
      int iTisch = 15, iAuf = 0, iAPt, iKugeln;
      char cFehler, cHelp;
      Ply sp;
      sp.iGes = 0;
      printf("Bitte geben sie Ihren Namen ein: ");
      scanf("%s",sp.cName);
    
      memcpy(sp.cArt,"Training",8);
    
      do {
      iAPt = 0;
      iAuf++;
      printf("Kugeln aufm Tisch: %3i\n",iTisch);
      do {
      printf("Verbleibende Kugeln: "); scanf("%i",&iKugeln); getchar();
      if (iKugeln == 15) {
        printf("Breakball gelocht? (j/n): "); 
        cHelp = toupper(getchar()); getchar();
        iAPt += iTisch - 1;
        iTisch = 15;
      }
      else {
        iAPt += iTisch - iKugeln;
        iTisch -= iTisch - iKugeln;
      }
      }while (iKugeln == 15 && cHelp == 'J');
    
      printf("Fehler: "); cFehler = getchar(); getchar();
      switch (cFehler) {
        case '1': iAPt -= 1; break;
        case '2': iAPt -= 1; break;
        case '3': iAPt -= 15; break;
        default: break; }
    
      sp.iGes += iAPt;
      sp.dSnt = sp.iGes*1.0/iAuf;
    
      }while (sp.iGes < 60 && iAuf <= 30);
    
      FILE *datei;
      datei = fopen("Statistiken.txt","a+");
    
      fprintf(datei, "%s, %s, %i, %.2lf\n", sp.cName,sp.cArt,sp.iGes,sp.dSnt);  
      fclose(datei);
    }
    

    in einer anderen funktion will ich diese daten dann auslesen und nach kriterien sortieren, und es wäre einfacher wenn man wüsste wie viel sätze man hat.

    wenn ich den cursor zum anfang setze dann überschreibt er einfach die Zahl ganz normal ja? und dann setz ich ihn wieder nach hinten?



  • Hallo,

    Reficul schrieb:

    wenn ich den cursor zum anfang setze dann überschreibt er einfach die Zahl ganz normal ja? und dann setz ich ihn wieder nach hinten?

    im Textmodus,
    wenn die Anzahl der Ziffern gleich ist, dann ja.
    Hast du da z.B. ne 99 stehen und schreibst ne 1 rein, so wird die erste Ziffer überschrieben und es steht 19 drin. Vermutlich nicht das, was du willst, ne.
    Eine mögliche Lösung ist für die erste Zeile eine Zahl mit konstanter Anzahl Zeichen zu nehmen, also z.B. "00000019\n", "00000001\n" usw, oder das können durchaus auch führende oder angehängte Leerzeichen sein, wenn man die Nullen nicht mag.

    Im Binärmodus,
    wenn die Anzahl der Bytes der Zahlen gleich ist, dann ja.
    Im Texteditor lässt sich die Zahl aber nicht lesen, vermutlich auch nicht das, was du willst, ne.

    Ansonsten, wenn nichts dagegen spricht die Zeilen beim Einlesen zu zählen, würde ich diesen Weg bevorzugen.

    Gruß,
    B.B.



  • DFie version mit dem Mitzählen ist auch erstmal die variante die ich genommen haben.

    naja die variante mit der Zahl die am Anfang der Datei steht, sollte machbar sein, weil die Zahl sollte nur steigend sein, die Datei wird ja nur ergänzt somit sollte die Anzahl nur steigend sein. werd das mal probieren...

    hab noch nen weiteres Problem:

    Die Datei wird korrekt erstellt und die Datensätze auch richtig reingeschrieben. Das Problem geht aber los wenn ich diese Datein wieder in das Programm lesen will...

    void Statistiken()
    {
      int i=0, nAnz=1;
      Ply sp[100];
      FILE *datei;
      datei = fopen("Statistiken.txt","r");
    
      do {
      fscanf(datei, "%s, %s, %i, %lf", sp[i].cName,sp[i].cArt,&sp[i].iGes,&sp[i].dSnt);
      i++;
      nAnz++;
      }while (fscanf(datei, "%s, %s, %i, %lf", sp[i].cName,sp[i].cArt,&sp[i].iGes,&sp[i].dSnt) != EOF);
    
      for(int k=0;k<nAnz;k++)
      printf("%s, %s, %i, %.2lf\n", sp[k].cName,sp[k].cArt,sp[k].iGes,sp[k].dSnt);
      fclose(datei);
    }
    

    Das ist grad so das was ich da haben, aber der liest komplett falsch aus? irgendwie hab ich da irgendwo was übersehen aber was?



  • Du hast da zweimal fscanf drin, machmal als Abbruchbedingung z.B. while ( !feof(Datei))



  • edit fehler behoben


Anmelden zum Antworten