Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何获取上次ungetc放回文件时的字符*_C - Fatal编程技术网

如何获取上次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*by
fopencookie
,问题是,我需要确保
文件*
没有缓冲任何内容,但是,
scanf
在解析宽度未知的字段时至少会提前读取一个字符,例如,对于%d,它将继续读取,直到找到空格或行尾。我假设
scanf
将通过
ungect
将字符放回
文件*
,在这种情况下,我还需要将此字符放回
istream
。可以知道哪个字符
scanf
ungets吗?谢谢。

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

< > <代码> STDIO < /C>的GNU LIB实现比原来应该更为明显,因为一个古老的(预EGCS,如果对你来说意味着什么)试图使文件对象直接可用作C++ >代码> StubBuf对象-不愚弄!但是你的问题的答案可以在这里找到:(名为
\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访问,因此丢失。这是完全错误的。在这种情况下,答案是:你不能。