在线文档教程
C++
输入/输出 | Input/output

std::ungetc

STD::ungetc

Defined in header
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。

二次

#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 }

二次

产出:

二次

%u scanned 123 %c scanned 'x'

二次

另见

fgetcgetcgets a character from a file stream (function)

C.ungetc的文档

© cppreference.com

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

http://en.cppreference.com/w/cpp/io/c/ungetc