假设我有一个由fopencookie
创建的FILE*
,如果我在FILE*
上调用ungetc
会发生什么? 假设我将FILE*
上的setvbuf
_IONBF
为_IONBF
以使其无缓冲。 看起来fopencookie不支持ungetc
的处理程序。
背景是我想在istream
上运行scanf
,请参阅istream对象上的scanf 。 一个建议是使用fopencookie
并且我试图通过fopencookie
将istream
包装为FILE *,问题出来了,我需要确保FILE*
没有缓冲任何东西,但是, scanf
至少会提前读取一个字符解析宽度未知的字段,例如对于%d,它将继续读取,直到找到空格或行尾。 我假设scanf
会通过ungetc
将字符放回FILE*
,在这种情况下我需要将此字符放回到istream
中。 是否有可能知道哪个字符scanf
命中? 谢谢。
fopencookie
是一个GNU扩展,据我所知,它不存在于其他C库中。
stdio
的GNU libc实现明显比它应该更加毛茸茸因为一个古老的(前EGCS,如果这意味着什么)你试图让FILE
对象直接用作C ++ streambuf
对象 – 没有傻瓜! – 但你的问题的答案可以在这里找到: https : _IO_sputbackc
( ungetc
的实现被命名为_IO_sputbackc
是这个古老尝试的剩余遗迹之一)我将引用代码,它很简短:
722 int 723 _IO_sputbackc (fp, c) 724 _IO_FILE *fp; 725 int c; 726 { 727 int result; 728 729 if (fp->_IO_read_ptr > fp->_IO_read_base 730 && (unsigned char)fp->_IO_read_ptr[-1] == (unsigned char)c) 731 { 732 fp->_IO_read_ptr--; 733 result = (unsigned char) c; 734 } 735 else 736 result = _IO_PBACKFAIL (fp, c); 737 738 if (result != EOF) 739 fp->_flags &= ~_IO_EOF_SEEN; 740 741 return result; 742 }
这就是说,如果推回的字符与FILE
对象缓冲区中读指针后面的字符相同,它只会将读指针递减一次; 否则, _IO_PBACKFAIL
。 在该目录中挖掘更多(特别是在libioP.h
和iofopncook.c
)显示用fopencookie
创建的FILE
上的fopencookie
调用_IO_default_pbackfail
这个函数要长得多,我不打算引用它,但它是什么确实是分配一个特殊的“备份缓冲区”并将字符存储在那里。 如有必要,此备份缓冲区可以增长以适应对ungetc
的任意数量的调用。
因此,您的问题的答案是,无论您连续多少次调用ungetc
(或其他库函数为您执行此操作),您的cookie函数将永远不会被要求做任何事情。 它全部由FILE
内部处理。 根据我对你的另一个问题的回答,我强烈建议你找到其他方法,但是对于你想要做的事情,我不明白为什么你认为你需要 “把这个角色也放回到istream
中”。
以上就是c/c++开发分享ungetc上次如何获取角色会重新输入文件*相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/519255.html