使用read()实现scanf

时间:2014-12-07 20:22:47

标签: c linux system scanf

我想使用read系统调用来实现scanf函数,但是我有一个问题 - 当你使用read时你必须指定它将读取多少位,而我不确定要使用的是什么数字。我已经为二进制数实现了标记%b,对于十六进制等实现了%x,我应该使用像256这样的常量位吗?

3 个答案:

答案 0 :(得分:3)

您可能必须实施缓冲层。当您调用read()时,您将从流中获取一些字节。从系统的角度来看,这些字节现在已经消失,并且不会被后续调用read()返回。问题是,如果你有一个像%d那样的格式说明符,那么在实际读取下一个非数字字节之前,你无法知道何时读完该数字。您必须将已读取的输入存储在某处,以便以后可以使用它,例如以下%s

答案 1 :(得分:0)

你基本上必须做自己的缓冲,因为你选择的任何数字在某些情况下可能太大(除非你选择一些非常小的东西)而在其他情况下太小(例如,很多空白),所以没有正确的数字。

答案 2 :(得分:0)

read(),如果没有一层缓冲代码,将无法实现scanf(),因为scanf()需要能够“取消”" unget"字符回到stdin

相反,scanf()可以使用fgetc()/unget()来实现,但无论采用何种路线,实施完整的scanf()都非常有用。