与Unix文件描述符相当的fgetc

时间:2015-08-21 03:26:00

标签: c unix io stream file-descriptor

fgetc(3)函数将FILE *作为其输入流。我必须使用read(2)重新实现一次一个字符的输入,或者是否有一个<unistd.h>样式的等效字符取代整数文件描述符?

2 个答案:

答案 0 :(得分:2)

不,没有这样的事情,请从不阅读(fd,&amp; ch,sizeof(char))(以下解释)

函数 read(2)通常作为system call实现到操作系统kernel。虽然这里不讨论这种事情的内部(和时髦)细节,但总体思路是系统调用(通常)便宜。

对于用户空间应用程序和内核来说只是为了从文件描述符中获取单个字符而进行系统调用是低效的。

例如, fgetc(3)通常最终会在 FILE 对象的结构中进行一些缓冲。这意味着来自 fgetc(3)的内部 read(2)不会只读取一个字符,而是会尝试获得更多为了提高效率。

无论如何,搞乱这种低级别的东西通常不是一个好主意。通过使用fdopen(3)从文件描述符创建 FILE 对象,您可以获得缓冲(以及 FILE 整体)的所有好处,因为您的问题出现了暗示你现在只有一个原始文件描述符。

答案 1 :(得分:0)

如果您愿意,可以使用open() -

打开文件
int fh = open("abc.txt", O_RDONLY, S_IREAD);  // there are different permissions you can provide (refer to link).

然后您可以在fh来电中使用read()