为什么没有 dscanf()?
Why is there no dscanf()?
为什么没有用于读取文件描述符的 dscanf 函数?
我们有用于打印的 fprintf、sprintf 和 dprintf,但用于扫描的只有 fscanf 和 sscanf。
因为 printf
和 scanf
函数族是 C 语言的一部分,处理文件描述符的函数不是。相反,它们是操作系统 API 的一部分(在 Linux 或 OSX 等 POSIX 平台上,其他平台模拟这些系统调用)。
并且 dprintf
函数 不是 标准 C 函数,它是一个扩展。来自 this printf
(and family) manual page:
The dprintf()
and vdprintf()
functions were originally GNU extensions that were later standardized in POSIX.1-2008.
没有 dscanf
功能可能只是那些制作原始 dprintf
扩展的人的疏忽。
无法写入 dscanf
。
scanf 系列要求缓冲流,否则它能够放回已读取的字符。 POSIX 文件描述符都不是。
考虑这个流
1234xyz
你会如何扫码呢?您不能逐字节读取它并在 x
之前停止。那将需要千里眼。你也不能阅读 x
并决定你不需要它,因为你不能把它放回去。
为什么没有用于读取文件描述符的 dscanf 函数?
我们有用于打印的 fprintf、sprintf 和 dprintf,但用于扫描的只有 fscanf 和 sscanf。
因为 printf
和 scanf
函数族是 C 语言的一部分,处理文件描述符的函数不是。相反,它们是操作系统 API 的一部分(在 Linux 或 OSX 等 POSIX 平台上,其他平台模拟这些系统调用)。
并且 dprintf
函数 不是 标准 C 函数,它是一个扩展。来自 this printf
(and family) manual page:
The
dprintf()
andvdprintf()
functions were originally GNU extensions that were later standardized in POSIX.1-2008.
没有 dscanf
功能可能只是那些制作原始 dprintf
扩展的人的疏忽。
无法写入 dscanf
。
scanf 系列要求缓冲流,否则它能够放回已读取的字符。 POSIX 文件描述符都不是。
考虑这个流
1234xyz
你会如何扫码呢?您不能逐字节读取它并在 x
之前停止。那将需要千里眼。你也不能阅读 x
并决定你不需要它,因为你不能把它放回去。