函数
<cwchar>

ungetwc

wint_t ungetwc (wint_t wc, FILE* stream);
将宽字符推回到流中
将宽字符 wc 虚拟地推回到输入流 stream 中,减少其 内部文件位置,如同之前进行的 getwc 操作被撤销一样。

这个 宽字符 可能与之前输入操作从 stream 读取的字符相同,也可能不同。无论如何,从 stream 中获取的下一个宽字符将是 wc,而与原始字符无关。

请注意,这仅影响对该 stream 的后续输入操作,而不会修改与之关联的物理文件的内容,物理文件不会因调用此函数而改变。

某些库实现可能支持多次调用此函数,使字符以推回的相反顺序可用。尽管这种行为没有标准的便携性保证,但执行多次调用后,除第一次之外的后续调用可能会失败。

如果成功,该函数将清除 stream文件结束指示符(如果当前已设置)。位置指示符 的值在所有通过此函数推回的字符被再次读取或丢弃之前是不确定的。ungetwc被再次读取或丢弃。

stream 调用 fseekfsetposrewind 将会丢弃先前通过此函数推回的所有字符。

如果作为 wc 传递的参数是 WEOF,则操作失败,输入 stream 保持不变。

这是 ungetc(在 <cstdio> 中)的 宽字符 等效函数。

参数

wc
要推回的宽字符的 wint_t 提升值。
该值在推回时被内部转换为wchar_t时推回。
stream
指向标识输入流的 FILE 对象的指针。
该流不应有任何朝向,或应是宽字符朝向的(对流的第一个 I/O 操作决定了它是字节朝向还是宽字符朝向,请参阅 fwide)。

返回值

成功时,返回被推回的 宽字符
如果操作失败,则返回 WEOF

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
/* ungetwc example */
#include <stdio.h>
#include <wchar.h>

int main ()
{
  FILE * pFile;
  wint_t wc;
  wchar_t buffer [256];

  pFile = fopen ("myfile.txt","rt");
  if (pFile!=NULL) while (!feof (pFile)) {
    wc=getwc (pFile);
    if (wc != WEOF) {
      if (wc == L'#') ungetwc (L'@',pFile);
      else ungetwc (wc,pFile);
      fgetws (buffer,255,pFile);
      fputws (buffer,stdout);
    }
  }
  return 0;
}

此示例打开名为myfile.txt的文件进行读取并打印其行,但在打印之前,获取每行的第一个字符并将其推回流中,除非该行以#开头,在这种情况下,它被替换为@.

另见