Я пытаюсь проанализировать данные со стандартного ввода в двоичном режиме под Win32.
Первое, что делает мой код, это проверяет 4-байтовый заголовок в начале:
int riff_header;
fread(&riff_header, sizeof(riff_header), 1, ifp);
// 'RIFF' = little-endian
if (riff_header != 0x46464952) {
fprintf(stderr, "wav2msu: Incorrect header: Invalid format or endianness\n");
fprintf(stderr, " Value was: 0x%x\n", riff_header);
return -1;
}
stdin
был переведен в двоичный режим перед чтением с него:
if (*argv[argc-1] == '-') {
fprintf(stderr, "Reading from stdin.\n");
infile = stdin;
// We need to switch stdin to binary mode, or else we run
// into problems under Windows
freopen(NULL, "rb", stdin);
}
Этот код отлично работает в Linux, однако в Win32 (в частности, в Windows XP) fread
, кажется, читает только один байт и, таким образом, приводит к сбою оценки.
Пример:
> ffmeg.exe -i ..\test.mp3 -f wav pipe:1 2> nul |..\foo.exe -o test.bin -
Reading from stdin.
foo: Incorrect header: Invalid format or endianness
Value was: 0x4
Что я делаю не так?