gpt4 book ai didi

c - 在 win32 下对标准输入使用 fread() 的问题

转载 作者:可可西里 更新时间:2023-11-01 14:41:31 25 4
gpt4 key购买 nike

我正在尝试在 Win32 下以二进制模式解析来自标准输入的数据。我的代码做的第一件事是检查开头的 4 字节 header :

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

我做错了什么?

最佳答案

根据MSDN documentation ,不允许为freopenpath参数传递NULL,所以对freopen的调用几乎可以肯定失败;你检查过返回值和errno的值了吗?当 pathNULL 时,C89 没有指定 freopen 的行为; C99 兼容,但 Microsoft C 运行时不兼容(也未声称兼容)C99。

如果您确实需要从stdin 读取二进制信息,您可能必须使用特定于平台的代码并直接使用ReadFile 读取原始二进制数据。在文件上GetStdHandle(STD_INPUT_HANDLE) .

关于c - 在 win32 下对标准输入使用 fread() 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7052896/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com