fwide

来自cppreference.com
< c‎ | io
在标头 <wchar.h> 定义
int fwide( FILE* stream, int mode );
(C95 起)

mode > 0,则试图令 stream 为宽取向。若 mode < 0,则试图令 stream 为字节取向。若 mode == 0,则只查询流的当前取向。

若已经决定流的取向(通过执行输出或通过之前调用 fwide),则此函数不做任何事。

参数

stream-指向修改或查询的 C I/O 流的指针
mode-大于零的整数设置流为宽,小于零的整数设置流为窄,零为仅查询

返回值

若流在此调用后为宽取向,则为大于零的整数,若流在此调用后为字节取向,则为小于零的整数,若流无取向,则为零。

示例

下列代码设置并重置流的取向。

#include <stdio.h>
#include <stdlib.h>
#include <wchar.h>
 
void show_orientation(int n)
{
    n < 0 ? puts("\t窄取向"):
    n > 0 ? puts("\t宽取向"):
            puts("\t无取向");
}
 
void try_read(FILE* fp)
{
    int c = fgetc(fp);
    c == EOF
        ? printf("\t读取窄字符失败\n")
        : printf("\t读取窄字符 '%c'\n", c);
 
    wint_t wc = fgetwc(fp);
    wc == WEOF
        ? printf("\t读取宽字符失败\n");
        : printf("\t读取宽字符 '%lc'\n", wc);
}
 
int main(void)
{
    enum fwide_orientation { narrow = -1, query, wide };
 
    FILE* fp = fopen("main.cpp", "r");
    if (!fp)
    {
        perror("fopen() 失败");
        return EXIT_FAILURE;
    }
 
    puts("1) 新打开的流是无取向的。");
    show_orientation(fwide(fp, query));
 
    puts("2) 建立字节取向。");
    show_orientation(fwide(fp, narrow));
    try_read(fp);
 
    puts("3) 只有 freopen() 可以重置流的取向。");
    if (freopen("main.cpp", "r", fp) == NULL)
    {
       perror("freopen() failed");
       return EXIT_FAILURE;
    }
 
    puts("4) 重新打开的流是无取向的。");
    show_orientation(fwide(fp, query));
 
    puts("5) 建立宽取向。");
    show_orientation(fwide(fp, wide));
    try_read(fp);
 
    fclose(fp);
}

可能的输出:

1) 新打开的流是无取向的。
        无取向
2) 建立字节取向。
        窄取向
        读取窄字符 '#'
        读取宽字符失败
3) 只有 freopen() 可以重置流的取向。
4) 重新打开的流是无取向的。
        无取向
5) 建立宽取向。
        宽取向
        读取窄字符失败
        读取宽字符失败 '#'

引用

  • C23 标准(ISO/IEC 9899:2024):
  • 7.29.3.5 The fwide function (第 TBD 页)
  • C17 标准(ISO/IEC 9899:2018):
  • 7.29.3.5 The fwide function (第 309 页)
  • C11 标准(ISO/IEC 9899:2011):
  • 7.29.3.5 The fwide function (第 423 页)
  • C99 标准(ISO/IEC 9899:1999):
  • 7.24.3.5 The fwide function (第 369 页)

参阅

打开文件
(函数)
fwide 的 C++ 文档