_setmode

设置文件转换模式。

语法

int _setmode (
   int fd,
   int mode
);

参数

fd
文件描述符。

mode
新转换模式。

返回值

如果成功,将返回之前的转换模式。

如果传递到此函数的参数无效,则将调用无效参数处理程序,如参数验证中所述。 如果允许执行继续,则此函数将返回 -1,并且将 errno 设置为指示无效文件描述符的 EBADF,或者设置为指示无效 mode 参数的 EINVAL

有关这些和其他的返回代码的详细信息,请参阅 errno_doserrno_sys_errlist_sys_nerr

备注

_setmode 函数将 mode 设置为由 fd 给定的文件的转换模式。 作为_O_TEXTmode设置 ANSI 文本(即已翻译)模式传递。 输入时回车符换行符 (CR-LF) 组合将转换为单个换行符。 输出时换行符将转换为 CR-LF 组合。 传递 _O_BINARY 可设置二进制(未转换)模式,在该模式下会禁止这些转换。

你还可以传递 _O_U16TEXT_O_U8TEXT_O_WTEXT 以启用 Unicode 模式,如本文档后面的第二个示例所示。

注意

Unicode 模式适用于宽打印函数(例如 wprintf),不支持窄打印函数。 在 Unicode 模式流中使用窄打印函数会触发断言。

_setmode 通常用于修改 stdinstdout 的默认转换模式,但是你可以在任何文件上使用它。 如果将 _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