#C 语言标准库函数 fwide
/*********************************************
* @brief 设置并查询文件流是否使用宽字符模式
* @param fp 文件流
* @param mode 模式
* @return 调用后的模式
********************************************/
int fwide(FILE* fp, int mode);
说明
设置并查询文件流是否使用宽字符模式。
- 参数
mode
> 0 表示将文件流设为面向宽字符的模式 - 参数
mode
< 0 表示将文件流设为面向字节的模式 - 参数
mode
== 0 表示仅查询文件流的模式
如果文件流已经被设置了模式,则无法进行修改。
- 面向字节的文件流只能调用
fputs
、fprintf
等面向字节的 I/O 函数 - 面向宽字符的文件流只能调用
fputws
、fwprintf
等面向宽字符的 I/O 函数
并且,尚未被设置模式的文件流首次调用 I/O 函数时,会被自动设置模式。
面向字节的 I/O 函数和面向宽字符的 I/O 函数不能再同一个文件流上混用。
例如调用 printf
会将 stdout
设为面向字节的模式,此后将无法调用 wprintf
;反之亦然。
参数
fp
- 要操作的文件流mode
- 模式> 0
- 面向宽字符的模式< 0
- 面向字节的模式== 0
- 仅查询,不修改模式
返回值
- 如果调用后文件流为宽字符模式,则返回正数
- 如果调用后文件流为字节模式,则返回负数
- 如果文件流没有设置模式,则返回 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)