fgetc 与 Unix 文件描述符的等价物
Equivalent of fgetc with Unix file descriptors
fgetc(3)
函数将 FILE *
作为其输入流。我必须使用 read(2)
重新实现一次输入一个字符,还是有一个 <unistd.h>
风格的等价物取而代之的是一个整数文件描述符?
不,没有这样的事情,请永远不要做read(fd, &ch, sizeof(char)) (下面有解释)。
函数read(2)通常实现为system call to the operating system kernel。虽然这里不讨论这种事情的内部(和时髦)细节,但总体思路是系统调用(通常)不是便宜的东西。
用户空间应用程序和内核执行系统调用只是为了从文件描述符中获取单个字符是低效的。
例如,fgetc(3) 通常会在 FILE 对象的结构内部进行一些缓冲。这意味着来自 fgetc(3) 的内部 read(2) 不会只读取单个字符,而是会尝试为了效率得到更多。
无论如何,搞砸这些低级的东西通常不是一个好主意。您可以通过使用 fdopen(3) 从文件创建 FILE 对象来获得缓冲(以及 FILEs 整体)的所有好处描述符,因为您的问题似乎暗示您目前手头只有一个原始文件描述符。
如果需要,您可以使用 open()
-
打开文件
int fh = open("abc.txt", O_RDONLY, S_IREAD); // there are different permissions you can provide (refer to link).
然后您可以在 read()
调用中使用 fh
。
fgetc(3)
函数将 FILE *
作为其输入流。我必须使用 read(2)
重新实现一次输入一个字符,还是有一个 <unistd.h>
风格的等价物取而代之的是一个整数文件描述符?
不,没有这样的事情,请永远不要做read(fd, &ch, sizeof(char)) (下面有解释)。
函数read(2)通常实现为system call to the operating system kernel。虽然这里不讨论这种事情的内部(和时髦)细节,但总体思路是系统调用(通常)不是便宜的东西。
用户空间应用程序和内核执行系统调用只是为了从文件描述符中获取单个字符是低效的。
例如,fgetc(3) 通常会在 FILE 对象的结构内部进行一些缓冲。这意味着来自 fgetc(3) 的内部 read(2) 不会只读取单个字符,而是会尝试为了效率得到更多。
无论如何,搞砸这些低级的东西通常不是一个好主意。您可以通过使用 fdopen(3) 从文件创建 FILE 对象来获得缓冲(以及 FILEs 整体)的所有好处描述符,因为您的问题似乎暗示您目前手头只有一个原始文件描述符。
如果需要,您可以使用 open()
-
int fh = open("abc.txt", O_RDONLY, S_IREAD); // there are different permissions you can provide (refer to link).
然后您可以在 read()
调用中使用 fh
。