# fwide

< 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 <wchar.h>
    #include <stdio.h>
    #include <stdlib.h>
    void try_read(FILE* fp)
    {
        int c = fgetc(fp);
        if(c == EOF) puts("narrow character read failed");
        else printf("narrow character read '%c'\n", c);

        wint_t wc = fgetwc(fp);
        if(wc == WEOF) puts("wide character read failed");
        else printf("wide character read '%lc'\n", wc);
    }
    void show(int n)
    {
        if(n == 0) puts("no orientation");
        else if (n < 0) puts("narrow orientation");
        else puts("wide orientation");
    }
    int main(void)
    {
        FILE* fp = fopen("main.cpp","r");
        if (!fp) {
            perror("fopen() failed");
            return EXIT_FAILURE;
        }

        // 新开的流无面向。
        show(fwide(fp, 0));

        // 建立面向字节。
        show(fwide(fp, -1));
        try_read(fp);

        // 只有freopen()能重置流面向。
        if (freopen("main.cpp","r",fp) == NULL)
        {
           perror("freopen() failed");
           return EXIT_FAILURE;
        }

        // 重开的流无面向。
        show(fwide(fp, 0));

        // 建立面向宽。
        show(fwide(fp, 1));
        try_read(fp);

        fclose(fp);
    }

可能的输出：

    no orientation
    narrow orientation
    narrow character read '#'
    wide character read failed
    no orientation
    wide orientation
    narrow character read failed
    wide character read '#'

### 引用

- C11 标准（ISO/IEC 9899:2011）：

  - 7.29.3.5 The fwide function (p: 423)

- C99 标准（ISO/IEC 9899:1999）：

  - 7.24.3.5 The fwide function (p: 369)

### 参阅

fopen fopen_s (C11) | 打开文件 (函数)