_setmode
设置文件转换模式。
语法
int _setmode (
int fd,
int mode
);
参数
fd
文件描述符。
mode
新转换模式。
返回值
如果成功,将返回之前的转换模式。
如果传递到此函数的参数无效,则将调用无效参数处理程序,如参数验证中所述。 如果允许执行继续,则此函数将返回 -1,并且将 errno
设置为指示无效文件描述符的 EBADF
,或者设置为指示无效 mode
参数的 EINVAL
。
有关这些和其他的返回代码的详细信息,请参阅 errno
、_doserrno
、_sys_errlist
和 _sys_nerr
。
备注
_setmode
函数将 mode
设置为由 fd
给定的文件的转换模式。 作为_O_TEXT
mode
设置 ANSI 文本(即已翻译)模式传递。 输入时回车符换行符 (CR-LF) 组合将转换为单个换行符。 输出时换行符将转换为 CR-LF 组合。 传递 _O_BINARY
可设置二进制(未转换)模式,在该模式下会禁止这些转换。
你还可以传递 _O_U16TEXT
、_O_U8TEXT
或 _O_WTEXT
以启用 Unicode 模式,如本文档后面的第二个示例所示。
注意
Unicode 模式适用于宽打印函数(例如 wprintf
),不支持窄打印函数。 在 Unicode 模式流中使用窄打印函数会触发断言。
_setmode
通常用于修改 stdin
和 stdout
的默认转换模式,但是你可以在任何文件上使用它。 如果将 _setmode
应用到流的文件描述符中,则先调用 _setmode
,然后再在该流上执行任何输入或输出操作。
注意
如果将数据写入文件流,请先通过使用 fflush
显式刷新代码,然后再使用 _setmode
更改该模式。 如果不刷新代码,可能会导致意外行为。 如果尚未将数据写入流,则不必刷新代码。
默认情况下,此函数的全局状态范围限定为应用程序。 若要更改此行为,请参阅 CRT 中的全局状态。
要求
例程 | 必需的标头 | 可选标头 |
---|---|---|
_setmode |
<io.h> |
<fcntl.h> |
有关兼容性的详细信息,请参阅 兼容性。
示例:使用 _setmode
更改 stdin
// crt_setmode.c
// This program uses _setmode to change
// stdin from text mode to binary mode.
#include <stdio.h>
#include <fcntl.h>
#include <io.h>
int main( void )
{
int result;
// Set "stdin" to have binary mode:
result = _setmode( _fileno( stdin ), _O_BINARY );
if( result == -1 )
perror( "Cannot set mode" );
else
printf( "'stdin' successfully changed to binary mode\n" );
}
'stdin' successfully changed to binary mode
示例:使用 _setmode
更改 stdout
// crt_setmodeunicode.c
// This program uses _setmode to change
// stdout to Unicode. Cyrillic and Ideographic
// characters will appear on the console (if
// your console font supports those character sets).
#include <fcntl.h>
#include <io.h>
#include <stdio.h>
int main(void) {
_setmode(_fileno(stdout), _O_U16TEXT);
wprintf(L"\x043a\x043e\x0448\x043a\x0430 \x65e5\x672c\x56fd\n");
return 0;
}
另请参阅
文件处理
_creat
, _wcreat
fopen
, _wfopen
_open
, _wopen
_set_fmode