首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么C stdio 'ungetc‘函数存在?

为什么C stdio 'ungetc‘函数存在?
EN

Software Engineering用户
提问于 2016-09-04 21:34:46
回答 1查看 767关注 0票数 6

在C编程语言(以及许多与C标准IO函数直接接口或构建传真的后续语言)中,存在一个名为ungetcint ungetc(int char, FILE *stream);的函数。它将一个字符放回正在读取的溪流的前面。这个回放只是虚拟的:原始输入流没有改变,只有随后的'getc‘调用的结果将首先读取'ungetc’值,然后再继续流中的实际下一个值。

为什么会有这种功能?只有使用“ungetc”才能处理的用例有哪些?

EN

回答 1

Software Engineering用户

回答已采纳

发布于 2016-09-04 23:01:21

简单的回答是ungetc 允许您在不消耗它的情况下窥视下一个字符。

假设您正在读取分组化的数据格式。除其他外,它包含一个帧同步模式。帧同步模式允许您通过在其他不同步数据流中标记数据帧的开始来对齐数据。

为了便于讨论,这里有一个数据定义:

代码语言:javascript
复制
[sync pattern] [packet length] [--------------data--------------] [checksum]

|---0xEB25---| |-- 16 bits --| |-- packet length minus 64 bits--| |32 bits |

选择同步模式EB25有许多原因。它的位模式可以抵抗假阳性,而且它是独一无二的,可以作为文件类型“魔术号”。

校验和用于检测传输错误和验证同步模式(因为EB25实际上是有效数据的可能性很小)。当与准确的数据包长度相结合时,同步模式、数据包长度和校验和的组合实际上保证了您已经确定了一个有效的数据包。

现在,想象一下,不需要备份到数据流中的前一点,就可以完成这个练习。要找到下一个数据包,您必须扫描字节,直到识别出EB25的同步模式,同时考虑到字节是反转的,因为规范基于小端点。一旦确定了同步模式,就必须读取数据包长度,然后读取数据包的其余部分,并计算校验和。如果校验和检查失败,则必须从失败同步模式后面的字节重新开始。要做到这一点,您必须备份到同步模式+4字节的开始,然后再开始扫描。

到目前为止,我还没有描述任何不能通过缓冲输入流来完成的事情。但是,如果同步模式不能保证在字节边界上对齐,怎么办?在这种情况下,同步模式的第一位可能发生在字节的中间。因此,要获得前8位,您必须读取两个字节,而不仅仅是一个字节。在这种情况下,如果没有连续的8位是E (而没有一个缓冲的读取器),那么向后删除一个字节不是有用的吗?

这不仅仅是一个无聊的假设。IRIG 106第10章规范正是这样工作的,尽管为了这个演示,我已经稍微简化了这个故事。

票数 16
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/330181

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档