ungetc上次如何获取角色会重新输入文件*

假设我有一个由fopencookie创建的FILE* ,如果我在FILE*上调用ungetc会发生什么? 假设我将FILE*上的setvbuf _IONBF_IONBF以使其无缓冲。 看起来fopencookie不支持ungetc的处理程序。

背景是我想在istream上运行scanf ,请参阅istream对象上的scanf 。 一个建议是使用fopencookie并且我试图通过fopencookieistream包装为FILE *,问题出来了,我需要确保FILE*没有缓冲任何东西,但是, scanf至少会提前读取一个字符解析宽度未知的字段,例如对于%d,它将继续读取,直到找到空格或行尾。 我假设scanf会通过ungetc将字符放回FILE* ,在这种情况下我需要将此字符放回到istream中。 是否有可能知道哪个字符scanf命中? 谢谢。

fopencookie是一个GNU扩展,据我所知,它不存在于其他C库中。

stdio的GNU libc实现明显比它应该更加毛茸茸因为一个古老的(前EGCS,如果这意味着什么)你试图让FILE对象直接用作C ++ streambuf对象 – 没有傻瓜! – 但你的问题的答案可以在这里找到: https : _IO_sputbackcungetc的实现被命名为_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.hiofopncook.c )显示用fopencookie创建的FILE上的fopencookie调用_IO_default_pbackfail这个函数要长得多,我不打算引用它,但它是什么确实是分配一个特殊的“备份缓冲区”并将字符存储在那里。 如有必要,此备份缓冲区可以增长以适应对ungetc的任意数量的调用。

因此,您的问题的答案是,无论您连续多少次调用ungetc (或其他库函数为您执行此操作),您的cookie函数将永远不会被要求做任何事情。 它全部由FILE内部处理。 根据我对你的另一个问题的回答,我强烈建议你找到其他方法,但是对于你想要做的事情,我不明白为什么你认为你需要 “把这个角色也放回到istream中”。