endlosschleife - warum ?



  • jo, beitragstitel sagt alles, ich komme aus der while-schleife nichtmehr raus, bis eine zugriffsverletzung auftritt. Die Datei "test.dat" enthält zwei Datansätze der Stuktur "TProgrammParameters".

    Was mache ich falsch ?

    struct TProgrammParameters
    {
     char code;
     char description[255];
     char programm[255];
    };
    
    [.....]
    
    void edit(void)
    {
     char description[255];
     BOOL same;
     FILE *programmfile;
    
     programmfile = fopen("test.dat", "r+b");
    
     clrscr();
    
      while(fread(&Data, sizeof(Data), 1, programmfile)) // <- da bleibt er ewig drin
      {
       same = true;
    
       if(strlen(description) == strlen(Data.description))
       {
        for(int i=0;i<strlen(description);i++)
        {
         if(description[i] != Data.description[i])
          same = false;
        }
       }
       else
        same = false;
    
       if(same == true)
       {
        Data.code = 5
        printf("Description: ");
        gets(Data.description);
        printf("Path: ");
        gets(Data.programm);
    
        fseek(programmfile, (sizeof(Data)*(-1)), SEEK_CUR);
    
        fwrite(&Data, sizeof(Data), 1, programmfile);
       }
      }
     fclose(programmfile);
    }
    


  • ach ja oben hab ich natürlich ein Objekt der Struktur "TProgrammParameters" erstellt, es heisst "Data"



  • while(fread(&Data, sizeof(Data), 1, programmfile)) // <- da bleibt er ewig drin
    

    Also so weit mein ungeübtes C++Auge das beurteilen kann heißt deine Schleife, dass er das durchführen soll, solange fread true zurückgibt. Und da die Datei ja nicht gelöscht wird, kanner weiterlesen und hört nicht mehr auf...



  • Zitat C-Builder Hilfe zu fread
    Im Falle eines Fehlers oder am Dateiende wird die Anzahl von Elementen (möglicherweise 0) zurückgeliefert, die noch fehlerfrei gelesen werden konnten.

    Er müsste eigentlich die Schleife so oft durchlaufen bis das Dateiende erreicht ist, das heisst er müsste die schleife zwei mal durchlaufen. Es muss irgendwie am "spulen" mit fseek liegen, denn wenn ich das spulen und schreiben rausmache, läuft die Schleife nur zweimal durch.

    Jemand noch ne Ahnung ?



  • Hab jetz die while Schleife ein wenig umgeschrieben, aber es ist immernoch eine Endloß-Schleife 😕

    while(fread(&Data, sizeof(Data), 1, programmfile))
    {
     if(searchcode == Data.code)
     {
      Data.code = 5;
      printf("\ndescription: ");
      gets(Data.description);
      printf("\nexecutable: ");
      gets(Data.programm);
    
      fseek(programmfile, (sizeof(Data)*(-1)), SEEK_CUR);
      fwrite(&Data, sizeof(Data), 1, programmfile);
     }
    }
    


  • Kenn micih nicht so wirklich aus aber folgendes siehtetwas komisch aus

    fseek(programmfile, (sizeof(Data)*(-1)), SEEK_CUR);
    

    Kann sein das ich jetzt was falsches sag ber fuer mich sieht das so aus als ob du die größe von data *(-1) als 2. parameter übergibst also wuerd ich sagen was negatives glaub ich


Log in to reply