Odczyt za pomocą funkcji fread

Odczyt za pomocą funkcji fread
K1
  • Rejestracja:prawie 10 lat
  • Ostatnio:około 9 lat
  • Postów:16
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ć.

Kopiuj
 

#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;
}

_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:3 miesiące
1

memcmp


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
edytowany 1x, ostatnio: _13th_Dragon
K1
  • Rejestracja:prawie 10 lat
  • Ostatnio:około 9 lat
  • Postów:16
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 :)

Kopiuj
 

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


mad_penguin
mad_penguin
  • Rejestracja:ponad 10 lat
  • Ostatnio:ponad 3 lata
  • Lokalizacja:Rzeszów
0

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

_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:3 miesiące
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.

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

więc albo:

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

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

Kopiuj

Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
K1
  • Rejestracja:prawie 10 lat
  • Ostatnio:około 9 lat
  • Postów:16
0

Ok działa. Dziękuje bardzo :)

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.