Verständis Problem mit struct



  • Hallo, ich habe hier ein Bild von einer Bitmap Struktur hochgeladen:
    https://image.ibb.co/bMVwYd/bitmap_file_info.png

    An Offset 14 im BITMAPINFOHEADER z.b. fängt das Feld biSize an.

    Im Code steht drin:

        // open input file
        FILE *inptr = fopen(infile, "r");
        if (inptr == NULL)
        {
            fprintf(stderr, "Could not open %s.\n", infile);
            return 2;
        }
    
        // open output file
        FILE *outptr = fopen(outfile, "w");
        if (outptr == NULL)
        {
            fclose(inptr);
            fprintf(stderr, "Could not create %s.\n", outfile);
            return 3;
        }
    
        // read infile's BITMAPFILEHEADER
        BITMAPFILEHEADER bf;
        fread(&bf, sizeof(BITMAPFILEHEADER), 1, inptr);
    
        // read infile's BITMAPINFOHEADER
        BITMAPINFOHEADER bi;
        fread(&bi, sizeof(BITMAPINFOHEADER), 1, inptr);
    

    Jetzt wundert es mich das hier die Strukturen mit den richtigen Werten initialisiert werden ohne das ja anscheinend inptr auf das richtige Offset Zeigt.

    Der BITMAPINFOHEADER fängt bei Offset 14 an. Müsste dann nicht eigentlich inptr auch auf Offset 14 in der Datei zeigen bevor fread ausgeführt wird? Weil sonst lese ich die Datei ja von Anfang ein. Aber der BITMAPINFOHEADER startet ja erst bei Offset 14 ....

    Die Struktur in C:

    // information about the type, size, and layout of a file
    // https://msdn.microsoft.com/en-us/library/dd183374(v=vs.85).aspx
    typedef struct
    {
        WORD bfType;
        DWORD bfSize;
        WORD bfReserved1;
        WORD bfReserved2;
        DWORD bfOffBits;
    } __attribute__((__packed__))
    BITMAPFILEHEADER;
    
    // information about the dimensions and color format
    // https://msdn.microsoft.com/en-us/library/dd183376(v=vs.85).aspx
    typedef struct
    {
        DWORD biSize;
        LONG biWidth;
        LONG biHeight;
        WORD biPlanes;
        WORD biBitCount;
        DWORD biCompression;
        DWORD biSizeImage;
        LONG biXPelsPerMeter;
        LONG biYPelsPerMeter;
        DWORD biClrUsed;
        DWORD biClrImportant;
    } __attribute__((__packed__))
    BITMAPINFOHEADER;
    


  • Es wird doch vorher BITMAPFILEHEADER eingelesen (14 Bytes), also steht der Datei-Offset doch richtig!



  • @bassmaster sagte in Verständis Problem mit struct:

    sizeof(BITMAPFILEHEADER)

        // read infile's BITMAPFILEHEADER
        BITMAPFILEHEADER bf;
        fread(&bf, sizeof(BITMAPFILEHEADER), 1, inptr);
    
        // read infile's BITMAPINFOHEADER
        BITMAPINFOHEADER bi;
        fread(&bi, sizeof(BITMAPINFOHEADER), 1, inptr);
    

    Achso ich glaub jetzt hab ich es verstanden. Sobald fread(&bf, sizeof(BITMAPFILEHEADER), 1, inptr); ausgeführt wird wird auch der inptr verschoben. (Er wird bis an das Ende von BITMAPFILEHEADER verschoben. Er liest ja auch so viel ein wie BITMAPFILEHEADER groß ist.)

    Ich dachte halt bei 2ten fread Aufruf wird der Dateizeiger wieder auf den Anfang der Datei gesetzt.

    Ok, hier steht es auch nochmal:
    http://www.cplusplus.com/reference/cstdio/fread/
    "The position indicator of the stream is advanced by the total amount of bytes read."



  • @bassmaster sagte in Verständis Problem mit struct:

    fread(&bf, sizeof(BITMAPFILEHEADER), 1, inptr);``` ausgeführt wird wird auch der inptr verschoben. 
    

    Nö! Nur die aktuelle Position im Stream hat sich geändert sowie der Inhalt des Speichers an der Stelle auf die inptr zeigt.

    inptr selbst hat sich in keiner Weise verändert.



  • @bassmaster sagte in Verständis Problem mit struct:

    Ich dachte halt bei 2ten fread Aufruf wird der Dateizeiger wieder auf den Anfang der Datei gesetzt.

    Du kannst auch eine Datei durch wiederholtes lesen eines Zeichens komplett durchgehen.