/*********************************************
* @brief 设置并查询文件流是否使用宽字符模式
* @param fp 文件流
* @param mode 模式
* @return 调用后的模式
********************************************/
int fwide(FILE* fp, int mode);
!subtitle:说明
设置并查询文件流是否使用宽字符模式。
参数 mode > 0 表示将文件流设为面向宽字符的模式
参数 mode < 0 表示将文件流设为面向字节的模式
参数 mode == 0 表示仅查询文件流的模式
如果文件流已经被设置了模式,则无法进行修改。
面向字节的文件流只能调用 fputs、fprintf 等面向字节的 I/O 函数
面向宽字符的文件流只能调用 fputws、fwprintf 等面向宽字符的 I/O 函数
并且,尚未被设置模式的文件流首次调用 I/O 函数时,会被自动设置模式。
面向字节的 I/O 函数和面向宽字符的 I/O 函数不能再同一个文件流上混用。
例如调用 printf 会将 stdout 设为面向字节的模式,此后将无法调用 wprintf;反之亦然。
!subtitle:参数
fp - 要操作的文件流
mode - 模式
> 0 - 面向宽字符的模式
< 0 - 面向字节的模式
== 0 - 仅查询,不修改模式
!subtitle:返回值
如果调用后文件流为宽字符模式,则返回正数
如果调用后文件流为字节模式,则返回负数
如果文件流没有设置模式,则返回 0
#include <stdio.h>
#include <wchar.h>
int main(void)
{
// 打开文件
FILE* fp = tmpfile();
if (fp == NULL)
{
perror("文件打开失败");
return 1;
}
// 查询模式
int mode = fwide(fp, 0);
if (mode > 0)
{
printf("文件流是面向宽字符的模式\n");
}
else if (mode < 0)
{
printf("文件流是面向字节的模式\n");
}
else
{
printf("文件流没有设置模式\n");
}
// 写文件
fputs("abcd", fp);
// 查询模式
mode = fwide(fp, 0);
if (mode > 0)
{
printf("文件流是面向宽字符的模式\n");
}
else if (mode < 0)
{
printf("文件流是面向字节的模式\n");
}
else
{
printf("文件流没有设置模式\n");
}
// 设置模式
mode = fwide(fp, 1);
if (mode > 0)
{
printf("文件流是面向宽字符的模式\n");
}
else if (mode < 0)
{
printf("文件流是面向字节的模式\n");
}
else
{
printf("文件流没有设置模式\n");
}
// 关闭文件
fclose(fp);
return 0;
}
运行结果:
文件流没有设置模式
文件流是面向字节的模式
文件流是面向字节的模式
说明:
示例中,文件刚刚被打开时,处于未被设置模式的状态。
调用 fputs 向文件写入字符串时被自动设为了面向字节的模式。
如果调用 fputws 则会自动设为面向宽字符的模式。
文件流被设置模式后不能修改,因此后面调用 fwide(fp, 1) 尝试设为面向宽字符的模式时没有生效。
C23 standard (ISO/IEC 9899:2024):
7.29.3.5 The fwide function (p: TBD)
C17 standard (ISO/IEC 9899:2018):
7.29.3.5 The fwide function (p: 309)
C11 standard (ISO/IEC 9899:2011):
7.29.3.5 The fwide function (p: 423)
C99 standard (ISO/IEC 9899:1999):
7.24.3.5 The fwide function (p: 369)