Odczyt za pomocą funkcji fread

0

Chcę odczytać 4 bajty z pliku vaw. Według specyfikacji powinno tam być RIFF więc funkcją strcmp sprawdzam czy to się zgadza ale problem w tym że fread oprócz 4 bajtów wczytuje też jakieś śmieci. Czy można to jakoś sensownie rozwiązać.

 

#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;

int main()
{
    FILE* fp = NULL;
    fp=fopen("plik.wav","r");
    if(!fp)
    {
        cout<<"Nie wczytano pliku"<<endl;
        return -1;
    }
    char type[4];
    fread(type,sizeof(char),4,fp);
    if(!strcmp(type,"RIFF"))
    {
        cout<<"RIFF Error"<<endl;
        return -1;
    }
    cout<<type<<endl;
}

1

memcmp

0

OK zamieniłem funkcję i porównywanie działa dobrze wyrzuca "RIFF Error" ale chciałbym żeby fread pobierał mi 4 bajty a pobiera 4 + śmieci. Czy możesz wyjaśnić dlaczego tak się dzieje?
Z góry dzięki :)

 

fread(type,sizeof(char),4,fp); //po wyświetleniu tablicy otrzymuje RIFF+śmieci
    if(!memcmp(type,"RIFF",4))
    {
        cout<<"RIFF Error"<<endl;
        return -1;
    }


0

W C stringi są zakończone zerem, a po twoim RIFF nie ma zera tylko jakieś losowe śmieci, które się wyświetlają.

3
krisso14 napisał(a):

... ale chciałbym żeby fread pobierał mi 4 bajty a pobiera 4 + śmieci

Pobiera dokładnie 4 bajty, zaś wyświetlasz 4 bajty plus śmieci.

cout<<type<<endl; // wyświetla c-string czyli musi być zakończony znakiem '\0'

więc albo:

cout<<type[0]<<type[1]<<type[2]<<type[3]<<endl;

albo: char type[5];
...
type[4]=0;
cout<<type<<endl;

0

Ok działa. Dziękuje bardzo :)

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