首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

std::ungetc

Defined in header <cstdio>

?

?

int ungetc( int ch, std::FILE *stream );

?

?

如果ch不等于EOF,推送角色ch%28重新解释为unsigned char%29进入与流关联的输入缓冲区stream以比后续读取操作更好的方式从stream会找回那个角色。与流关联的外部设备不被修改。

流重定位操作std::fseek,,,std::fsetpos,和std::rewind抛弃…的影响ungetc...

如果ungetc在没有中间读取或重新定位的情况下多次调用,它可能会失败%28,换句话说,可以保证一个大小为1的后推缓冲区,但是任何较大的缓冲区都是实现定义的%29。如果多次成功ungetc执行后,读取操作将以反向顺序检索推送字符。ungetc...

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

一次成功的呼叫ungetc清除文件状态结束标志。std::feof...

一次成功的呼叫ungetc在二进制流上,流位置指示符减少1%28,如果流位置指示符为0%29,则行为不确定。

一次成功的呼叫ungetc在文本流上,以未指定的方式修改流位置指示符,但确保在通过读取操作检索所有回推字符之后,流位置指示符与其之前的值相等。ungetc...

参数

ch

-

character to be pushed into the input stream buffer

stream

-

file stream to put the character back to

返回值

论成功ch会被归还。

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

注记

在实践中,推送缓冲区的大小从4k%28Linux、MacOS%29到最小的4%28Solaris%29或保证的最低1%HPUX、AIX%29不等。

如果推送的字符等于外部字符序列%28中在该位置存在的字符,则推回缓冲器的表观大小可能更大,实现可以简单地减少读取文件位置指示符,并避免维护回溯缓冲区%29。

演示在其最初用途中使用ungetc:实现scanf。

二次

代码语言:javascript
复制
#include <cctype>
#include <cstdio>
 
void demo_scanf(const char* fmt, std::FILE* s) {
    if(*fmt == '%') {
        switch(*++fmt) {
            case 'u': {
                int c;
                while(std::isspace(c=std::getc(s))) {} // skip leading white space
                unsigned int num = 0;
                while(std::isdigit(c)) {
                    num = num*10 + c-'0';
                    c = std::getc(s);
                }
                std::printf("%%u scanned %u\n", num);
                std::ungetc(c, s); // reprocess the non-digit
            }
            case 'c': {
                int c = std::getc(s);
                std::printf("%%c scanned '%c'\n", c);
            }
        }
    }
}
 
int main()
{
    std::FILE* f = std::fopen("input.txt", "w+");
    std::fputs("123x", f);
    std::rewind(f);
    demo_scanf("%u%c", f);
    std::fclose(f);
}

二次

产出:

二次

代码语言:javascript
复制
%u scanned 123
%c scanned 'x'

二次

另见

fgetcgetc

gets a character from a file stream (function)

C.ungetc的文档

代码语言:txt
复制
 ? cppreference.com

在CreativeCommonsAttribution下授权-ShareAlike未移植许可v3.0。

扫码关注腾讯云开发者

领取腾讯云代金券

http://www.vxiaotou.com