Problem beim random-Zugriff innerhalb einer binär Datei



  • Hallöchen,

    ich versuche nun mal wieder mit Dateien umzugehen. Diesmal habe ich in eine binär Datei 10 werte geschrieben.
    Diese Werte kann ich auch wieder lesen, von daher wird die Ablage funktionieren. 🙂

    Nun kann der Benutzer einen gewünschten Index angeben, um einen bestimmten Wert innerhalb der binär Datei auszulesen.
    Also,
    1. gewünschten Index ermitteln:

    long index;
    scanf("%ld",&index);
    

    2. versuchen die Stelle innerhalb der Datei auszulesen:

    int readRandom(long index)
    {
        FILE *fp;
        int value;    
    
        fp = fopen("bindata.bin","rb");
        if(fp == NULL)
        {
            printf("Fehler beim oeffnen der Datei!\n");
        }
        else
        {
            fseek(fp,index,0); // 0 = start + offset
    	int readCount = fread(&value, sizeof(int), 1, fp);
    	printf("Es wurden %d Zeichen eingelesen\n",readCount);
    	printf("Am Index %ld steht der Wert %d\n",index, value);
        }
        fclose(fp);
        return 0;
    }
    

    Für mich sieht der Code "ok" aus. 😉
    Nur leider wird mir für "value" immer ein Wert ausgegeben, der nichts mit dem integer zu tun hat, den ich in die Datei geschrieben habe.
    Seht ihr einen Fehler?

    MfG
    wax



  • so wie du das machst würde das mit einzelnen zeichen, die ein byte lang sind, funktionieren.
    ein integer hat aber eine länge von mehr als einem byte. gibts du also z.b. als index eine 3 ein, landest du irgendwo mitten in einer integer-zahl. kein wunder also, das deine werte nicht stimmen.

    du müsstest fseek( fp, index*sizeof(int), 0 ) aufrufen.



  • Oh mein Gott bin ich fertig. 🙂
    Danke, da hätte ich auch selbst drauf kommen können.

    MfG
    wax



  • wax schrieb:

    Oh mein Gott bin ich fertig. 🙂
    Danke, da hätte ich auch selbst drauf kommen können.
    MfG
    wax

    😃

    wie kommst du eigentlich auf random zugriff *grübel*



  • Ach der Code war glaube ich mal für was anderes gedacht. Hatte keine Lust den Namen zu ändern. Ist eh nur was für Testcode.

    🙂


Log in to reply