如何获取上次ungetc放回文件时的字符*
假设我有一个由如何获取上次ungetc放回文件时的字符*,c,C,假设我有一个由fopencookie创建的文件*,如果我在文件*上调用ungect会发生什么?假设我已将文件*上的设置为\u IONBF以使其无缓冲。看起来fopencookie不支持ungetc的处理程序 背景是我想在istream上运行scanf,请参阅。一个建议是使用fopencookie,我试图通过fopencookie将istream包装为FILE*byfopencookie,问题是,我需要确保文件*没有缓冲任何内容,但是,scanf在解析宽度未知的字段时至少会提前读取一个字符,例如,
fopencookie
创建的文件*
,如果我在文件*
上调用ungect
会发生什么?假设我已将文件*
上的设置为\u IONBF
以使其无缓冲。看起来fopencookie不支持ungetc
的处理程序
背景是我想在istream
上运行scanf
,请参阅。一个建议是使用fopencookie
,我试图通过fopencookie
将istream
包装为FILE*byfopencookie
,问题是,我需要确保文件*
没有缓冲任何内容,但是,scanf
在解析宽度未知的字段时至少会提前读取一个字符,例如,对于%d,它将继续读取,直到找到空格或行尾。我假设scanf
将通过ungect
将字符放回文件*
,在这种情况下,我还需要将此字符放回istream
。可以知道哪个字符scanf
ungets吗?谢谢。fopencookie
是一个GNU扩展,据我所知,它不存在于其他C库中
< > <代码> STDIO < /C>的GNU LIB实现比原来应该更为明显,因为一个古老的(预EGCS,如果对你来说意味着什么)试图使\u IO\u sputbackc
的ungetc的实现是这一古老尝试的残余之一)我将引用代码,它很短:
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 }
这意味着,如果向后推的字符与文件
对象缓冲区中读取指针正后方的字符相同,它只会将读取指针递减一次;否则,将调用\u IO\u PBACKFAIL
。在该目录(特别是在和中)中再深入挖掘一下,就会发现使用fopencookie
创建的文件上的\u IO\u PBACKFAIL
调用的函数要长得多,我不打算引用它,但它所做的是分配一个特殊的“备份缓冲区”并将字符隐藏在那里。如有必要,此备份缓冲区可以增长以容纳对ungect
的任意数量的调用
因此,您的问题的答案是,无论您连续调用ungect
多少次(或其他库函数为您执行),您的cookie函数都不会被要求执行任何操作。所有这些都在文件的内部处理。根据我对您的另一个问题的回答,我强烈建议您找到其他方法,但对于您试图做的事情,我不明白您为什么认为需要“将此字符也放回istream
”。您的名字正确吗?比你能做的还要科学。试试看。或者,看看libc源代码……就像@Deduplicator所说的<代码>试试看
。你将从5分钟的测试和可能的成功或失败中学到比数小时的阅读和思考更多的东西。你不会弄坏它,但如果你弄坏了,你就可以保留碎片,看看哪里出了问题!实验!犯错误正如阿西莫夫所说,大多数发现不是来自“I wonder
”,而是来自“hmm,这很奇怪”@lornix,好吧,我稍微更改了一下标题以反映我问题的操作性质。我需要将其角色恢复到istream的原因是,我将混合调用cstdio函数和iostream函数。如果我在扫描后使用istream,文件中的字符将无法被istream访问,因此丢失。这是完全错误的。在这种情况下,答案是:你不能。