2560

13 分钟

#C 语言标准库函数 fwide

/********************************************* * @brief 设置并查询文件流是否使用宽字符模式 * @param fp 文件流 * @param mode 模式 * @return 调用后的模式 ********************************************/ int fwide(FILE* fp, int mode);

说明

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

  • 参数 mode > 0 表示将文件流设为面向宽字符的模式
  • 参数 mode < 0 表示将文件流设为面向字节的模式
  • 参数 mode == 0 表示仅查询文件流的模式

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

  • 面向字节的文件流只能调用 fputsfprintf 等面向字节的 I/O 函数
  • 面向宽字符的文件流只能调用 fputwsfwprintf 等面向宽字符的 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)

创建于 2025/8/14

更新于 2025/8/14