我想使用read系统调用来实现scanf函数,但是我有一个问题 - 当你使用read时你必须指定它将读取多少位,而我不确定要使用的是什么数字。我已经为二进制数实现了标记%b
,对于十六进制等实现了%x
,我应该使用像256
这样的常量位吗?
答案 0 :(得分:3)
您可能必须实施缓冲层。当您调用read()
时,您将从流中获取一些字节。从系统的角度来看,这些字节现在已经消失,并且不会被后续调用read()
返回。问题是,如果你有一个像%d
那样的格式说明符,那么在实际读取下一个非数字字节之前,你无法知道何时读完该数字。您必须将已读取的输入存储在某处,以便以后可以使用它,例如以下%s
。
答案 1 :(得分:0)
你基本上必须做自己的缓冲,因为你选择的任何数字在某些情况下可能太大(除非你选择一些非常小的东西)而在其他情况下太小(例如,很多空白),所以没有正确的数字。
答案 2 :(得分:0)
read()
,如果没有一层缓冲代码,将无法实现scanf()
,因为scanf()
需要能够“取消”" unget"字符回到stdin
。
相反,scanf()
可以使用fgetc()/unget()
来实现,但无论采用何种路线,实施完整的scanf()
都非常有用。