Odczytanie pliku binarnego

0

Cześć, mam zrobić coś takiego:

W pliku „odczyt.bin” znajduje się pewna ilość danych w kolejności. rozmiar tablicy typu int (zmienna int).
Tablica o tylu elementach (typu int) ile zapisano wcześniej. Rozmiar tablicy typu float (zmienna int)
Tablica o tylu elementach (typu float) ile zapisano wcześniej.
Zapisz kod, który pobierze dane z pliku a następnie wydrukuje wartości z tablicy typu int.

mój kod:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main()
{
    FILE *file = NULL;
    file = fopen("odczyt.bin","r");
    if(file == NULL)
    {
        printf("Blad otwarcia pliku\n");
        return 1;
    }
    int *tab = NULL;
    float *tab2 = NULL;
    int x,y;
    fread(&x, sizeof(int), 1, file);
    tab = (int*)malloc(x);
    fread(tab, sizeof(int), x, file);
    fread(&y, sizeof(int), 1, file);
    tab2 = (float*)malloc(y);
    fread(tab2, sizeof(float), y, file);
    for(int i =0; i<x; i++)
    {
printf("%d ", tab[i]);
    }
    for(int i =0; i<x;i++)
   {
    printf("%d ", tab[i]);
   }

    fclose(file);
    
    return 0;
}

jest jakiś problem z ta linijka:

fread(tab2, sizeof(float), y, file);

gdy jest zakomentowana to tablica tab wyświetla się normalnie:

3500 -14000 1200 2900 -8500 4200 -3300 5525 3500 -14000 1200 2900 -8500 4200 -3300 5525

gdy odkomentuję pojawiają się jakieś losowe liczby:

3500 -14000 1200 2900 1120468992 1110756557 1168759194 1163398758 3500 -14000 1200 2900 1120468992 1110756557 1168759194 1163398758

Gdzie jest błąd, co zmienić żeby program działał? Z góry dzięki.

1

malloc wymaga podania liczby bajtów:

tab = (int*)malloc(x * sizeof(int));
tab2 = (float*)malloc(y * sizeof(float));
1
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main()
{
    FILE *file=fopen("odczyt.bin","rb"); // koniecznie `b` jak binary
    if(!file)
    {
        printf("Blad otwarcia pliku\n");
        return 1;
    }
    int tbIntCount;
    fread(&tbIntCount,sizeof(int),1,file);
    int tbInt=(int*)malloc(sizeof(int)*tbIntCount);
    fread(tbInt,sizeof(int),tbIntCount,file);
    int tbFloatCount;
    fread(&tbFloatCount,sizeof(int),1,file);
    float *tbFloat=(float*)malloc(sizeof(float)*tbFloatCount);
    fread(tbFloat,sizeof(float),tbFloatCount,file);
    for(int i=0;i<tbIntCount;++i) printf("%d ",tbInt[i]);
    for(int i=0;i<tbFloatCount;++i) printf("%f ",tbFloat[i]);
    free(tbFloat);
    free(tbInt);
    fclose(file);
    return 0;
}
0

Dwie uwagi.

Zastanów się co by się stało jakby komp na którym stworzono plik miał inne wielkości inta, niż miejsce gdzie kompilujesz swój program.
To taki duperel w ramach przemyśleń.

Po drugie.

    fread(&x, sizeof(int), 1, file);

powinno wyglądać tak:

    fread( &x, sizeof x, 1, file);
0

Więcej problemów niż pożytku.

było:

short len=strlen(text)+1; // tu ostrzeżenie że do shorta może się nie zmieścić
fwrite(&short,sizeof(len),1,file);

Jeden "spryciarz" zamienił to na:

size_t len=strlen(text)+1; // już nie ma ostrzeżenia w BIGENDIAN odczyt ok
fwrite(&short,sizeof(len),1,file);

Kilka dni szukaliśmy.

0 użytkowników online, w tym zalogowanych: 0, gości: 0