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'
二次
另见
fgetcgetc | gets a character from a file stream (function) |
---|
C.ungetc的文档
© cppreference.com
在CreativeCommonsAttribution下授权-ShareAlike未移植许可v3.0。