命名空间
变体
操作

std::ungetc

来自 cppreference.cn
< cpp‎ | io‎ | c
 
 
 
 
定义于头文件 <cstdio>
int ungetc( int ch, std::FILE *stream );

如果 ch 不等于 EOF,则将字符 ch(重新解释为 unsigned char)压入与流 stream 相关联的输入缓冲区,以便后续从 stream 读取操作将检索到该字符。与流相关联的外部设备未被修改。

流重定位操作 std::fseekstd::fsetposstd::rewind 会丢弃 ungetc 的效果。

如果 ungetc 在没有 intervening 读取或重定位的情况下被多次调用,它可能会失败(换句话说,保证大小为 1 的回推缓冲区,但任何更大的缓冲区都是实现定义的)。如果执行了多次成功的 ungetc,读取操作将按 ungetc 的相反顺序检索回推的字符。

如果 ch 等于 EOF,则操作失败且流不受影响。

成功调用 ungetc 会清除文件结束状态标志 std::feof

成功调用 ungetc 在二进制流上会将流位置指示器减一(如果流位置指示器为零,则行为不确定)。

成功调用 ungetc 在文本流上会以未指定的方式修改流位置指示器,但保证在所有回推字符通过读取操作检索后,流位置指示器等于其在 ungetc 之前的值。

目录

[编辑] 参数

ch - 要推入输入流缓冲区的字符
stream - 要将字符推回的文件流

[编辑] 返回值

成功时返回 ch

失败时返回 EOF,并且给定的流保持不变。

[编辑] 注意

回推缓冲区的大小在实践中从 4k(Linux、MacOS)到小至 4(Solaris)或保证的最小 1(HPUX、AIX)不等。

如果回推的字符等于外部字符序列中该位置存在的字符,则回推缓冲区的表观大小可能更大(实现可能只需递减读取文件位置指示器并避免维护回推缓冲区)。

[编辑] 示例

演示 std::ungetc 的原始用途:实现 std::scanf

#include <cctype>
#include <cstdio>
 
void demo_scanf(const char* fmt, std::FILE* s)
{
    while (*fmt != '\0') {
        if (*fmt == '%') {
            switch (*++fmt) {
                case 'u': {
                    int c{};
                    while (std::isspace(c=std::getc(s))) {}
                    unsigned int num{};
                    while (std::isdigit(c)) {
                        num = num*10 + c-'0';
                        c = std::getc(s);
                    }
                    std::printf("%%u scanned %u\n", num);
                    std::ungetc(c, s);
                    break;
                }
                case 'c': {
                    int c = std::getc(s);
                    std::printf("%%c scanned '%c'\n", c);
                    break;
                }
            }
        } else {
            ++fmt;
        }
    }
}
 
int main()
{
    if (std::FILE* f = std::fopen("input.txt", "w+")) {
        std::fputs("123x", f);
        std::rewind(f);
        demo_scanf("%u%c", f);
        std::fclose(f);
    }
}

输出

%u scanned 123
%c scanned 'x'

[编辑] 另请参阅

从文件流中获取一个字符
(function) [编辑]
C 文档 适用于 ungetc