【发布时间】:2011-10-26 13:02:57
【问题描述】:
我正在尝试在 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
我做错了什么?
【问题讨论】:
-
如果您不执行
freopen会发生什么? -
标头检查正常,但由于 windows 处理换行符的方式不同,我稍后运行的其他检查得到了无意义的结果:-/
-
好的。我只是想仔细检查一下这个问题是否特定于重新打开的标准输入,而不仅仅是一般的 Windows。
-
是否可以过滤输入并将\r\n序列转换为\n?