【发布时间】:2013-01-28 14:55:21
【问题描述】:
我偶然发现了这段 C 代码。它使用freopen以二进制模式重新打开stdin:
if (!isatty(STDIN_FILENO))
freopen(NULL, "rb", stdin);
我不明白 isatty 测试从何而来。这是否意味着重新打开终端没有意义?
省略 isatty 测试,离开会有什么问题
freopen(NULL, "rb", stdin);
【问题讨论】:
-
在 Unix 上使用 'b' 不会造成任何损害,但也不会改变。
-
在文本和二进制模式没有区别的 Unix 上不需要此代码。知道这段代码是否真的适用于 Win32 是另一个问题的主题:) link
-
如果您担心 Windows,请非常担心。如果您不关心 Windows,那么您可以无条件地执行
freopen(),它不会有任何区别,但不会造成任何损害。整个测试仅在二进制文件和文本文件之间存在差异的系统(也称为 Windows)上才有意义,并且链接的问题表明存在特定于 Windows(无论如何非 POSIX)的函数setmode()来执行所需的操作其中显示的freopen()会导致“未定义的行为”,应该在运行时捕获某种异常处理程序。 -
关于更改二进制/文本模式,old.nabble.com/…有讨论