【问题标题】:Force C to readin stdin as binary using MINGW使用 MINGW 强制 C 以二进制形式读取标准输入
【发布时间】:2023-03-23 22:41:01
【问题描述】:

所以,我有一个用例,我需要强制交叉编译到 Windows 的 C 程序以二进制格式读取标准输入。这对 Windows 编译器很有用,但不幸的是我正在使用 MinGW 编译这个程序,所以我无法访问设置标准输入的模式,因为这是一个 pre-MSDOS、pre-UNIX 约定。在 GCC 中编译此代码的同时,我将如何强制这种情况发生?有什么想法吗?

错误陈述如下:

__setmode(__fileno(stdin), O_BINARY);
__setmode(__fileno(stdout), O_BINARY);

【问题讨论】:

  • 它应该是_setmode(_fileno(stdin), _O_BINARY);(只有一个下划线)并确保您已包含所有必需的标题。
  • 包含的标题有哪些?我认为问题在于我没有所需的标题。

标签: c windows mingw std stdin


【解决方案1】:

以上语句与编译器无关,而是与您要链接的头文件和 C 库有关。

MinGW 使用 Microsoft 运行时库和兼容的头文件。您可能对这些函数有错误的拼写,请尝试删除头文件中的一些 _、grep for setmode 等:

grep -r setmode /usr/include
grep -r O_BINARY /usr/include

如果找不到这些,请从 microsoft 标头中复制原型和 #define

cremno 建议这样做:

_setmode(_fileno(stdin), _O_BINARY);
_setmode(_fileno(stdout), _O_BINARY);

如果您真的找不到这些符号,试试这个:

extern int _setmode(int, int);
_setmode(0, 0x8000);
_setmode(1, 0x8000);

【讨论】:

  • 次要挑剔:据我所知,Microsoft 不再为 msvcrt.dll 提供标头,这是 MinGW 使用的运行时。因此,如果 MinGW 标头不包含您要查找的功能,并且您找不到第三方标头,则唯一的选择是逆向工程或反复试验。
  • _setmode(0, 0x8000) 坦率地说难以理解,更不用说容易出错了; (你怎么知道_O_BINARY会一直表示为0x8000?)正确的表述是包含<stdio.h><io.h><fcntl.h>all,然后使用_setmode (STDIN_FILENO, _O_BINARY);_setmode (STDOUT_FILENO, _O_BINARY),(也许还有 _setmode (STDERR_FILENO, _O_BINARY))。
  • @Keith Marshall:当然难以理解。在这个虚假 API 没有实际的宏和函数定义的情况下,这是最后的尝试。 01 是标准输入和输出的标准低级文件句柄,O_BINARY 在 DOS 世界中曾经是 0x8000,它可能已更改为 32 位或 64 位 MSVC 运行时库,任何有权访问的人到正确的头文件请确认。
  • @chqrlie:是的,我明白你的意思。我的观点是,如果您使用的是 MinGW,那么您肯定拥有适当的头文件;你应该使用它们,然后你就没有理由编写难以理解的代码,也没有理由关心适当的清单常量的实际值可能是什么,无论它们是常规标准化的还是特定于实现的。
猜你喜欢
  • 2010-12-08
  • 2011-02-20
  • 2015-11-23
  • 1970-01-01
  • 2010-12-01
  • 1970-01-01
  • 2015-10-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多