C++官网参考链接:https://cplusplus.com/reference/cwchar/ungetwc/
函数
<cwchar>
ungetwc
wint_t ungetwc (wint_t wc, FILE* stream);
从流中放回宽字符
宽字符wc实际上被放回到输入stream中,降低了它的内部文件位置,就像之前的getwc操作被撤消了一样。
这个宽字符可能是也可能不是前面输入操作中从stream中读取的字符。在任何情况下,从stream中获取到的下一个宽字符是wc,独立于原始字符。
但是请注意,这只影响该stream上的进一步输入操作,而不影响与之关联的物理文件的内容,对该函数的任何调用都不会修改该内容。
有些库实现可能支持多次调用这个函数,使字符以相反的放置顺序可用。尽管这种行为没有标准的可移植性保证,并且在第一次调用之后的任何数量的调用都可能失败。
如果成功,该函数清除stream的文件结束指示符(如果当前设置了该指示符)。位置指示符有未指定的值,直到再次读取或丢弃使用ungetwc放回的所有字符。
在stream上调用fseek,fsetpos或rewind将丢弃之前通过此函数放回的任何字符。
如果作为wc传递的实参是WEOF,则操作失败,输入stream保持不变。
这相当于ungetc(<cstdio>)的宽字符。
形参
wc
宽字符的wint_t提升被放回。
该值在放回时内部转换为wchar_t。
stream
指向标识输入流的FILE对象的指针。
流还没有方向,或者是宽字符方向的(流上的第一个I/O操作决定它是面向字节的还是面向宽字符的,参见fwide)。
返回值
如果成功,宽字符就会被放回。
如果操作失败,则返回WEOF。
用例
/* 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的现有文件以读取并打印它的行,但首先获取每行的第一个字符并将其放回流中,除非行以#开头,在这种情况下,它被替换为@。
另请参考
ungetc Unget character from stream (function)
getwc Get wide character from stream (function)
fgetwc Get wide character from stream (function)
putwc Write wide character to stream (function)