国际访客建议访问 Primers 编程伙伴 国际版站点 > C 教程 > fwide 以获得更好的体验。

# C 语言标准库函数 fwide

在头文件 wchar.h 中定义。
/*********************************************
 * @brief 设置并查询文件流是否使用宽字符模式
 * @param fp 文件流
 * @param mode 模式
 * @return 调用后的模式
 ********************************************/
int fwide(FILE* fp, int mode);

!subtitle:说明

设置并查询文件流是否使用宽字符模式。

  • 参数 mode > 0 表示将文件流设为面向宽字符的模式

  • 参数 mode < 0 表示将文件流设为面向字节的模式

  • 参数 mode == 0 表示仅查询文件流的模式

如果文件流已经被设置了模式,则无法进行修改。

  • 面向字节的文件流只能调用 fputsfprintf 等面向字节的 I/O 函数

  • 面向宽字符的文件流只能调用 fputwsfwprintf 等面向宽字符的 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)

本文 更新于: 2025-11-27 09:38:08 创建于: 2025-11-27 09:38:08