C 具有文件描述符而不是文件指针的getline()

C 具有文件描述符而不是文件指针的getline(),c,posix,getline,libc,C,Posix,Getline,Libc,据我所知,没有一种libc等价于使用文件描述符而不是使用文件* 有(技术)原因吗?您可以使用fdopen从文件描述符创建文件流 一般来说,要从文件描述符中提取一行,您需要一次向操作系统请求一个字符,这是非常低效的。(POSIX Shell中的read内置程序的工作原理是这样的,它通过一次检索一个字节来非常低效地读取行。) 文件流成批地从操作系统请求数据,这提高了效率,但是文件描述符可能不是一个可倒带的文件,它可能是一个套接字或管道,如果您请求100个字符,那么这100个批的第三个字符是换行符,那

据我所知,没有一种libc等价于使用文件描述符而不是使用
文件*


有(技术)原因吗?

您可以使用
fdopen
从文件描述符创建文件流

一般来说,要从文件描述符中提取一行,您需要一次向操作系统请求一个字符,这是非常低效的。(POSIX Shell中的
read
内置程序的工作原理是这样的,它通过一次检索一个字节来非常低效地读取行。)


文件流成批地从操作系统请求数据,这提高了效率,但是文件描述符可能不是一个可倒带的文件,它可能是一个套接字或管道,如果您请求100个字符,那么这100个批的第三个字符是换行符,那么就没有办法一般地撤销对它后面97个字符的读取。

getline
不是C标准的,我想你是说POSIX特性?术语文件描述符是如此主观,它可以是从IOFile到套接字的任何东西。因此,read line可能不是一种正确的实现方法,除非它与文件非常相关。您不需要一次向操作系统请求一个字符,一个简单的实现是可以使用静态缓冲区,一次从操作系统获取您想要的字节数。这实际上是我在Epitech学习的学校里的一个编码练习,叫做get_next_line。我相信你可以在GitHub上找到很多以这个名字命名的学生项目。请注意,如果要使用其中一个描述符,则应获得一个将文件描述符保存在一个数组中的描述符,以便一次能够处理多个文件。@deb0ch当然。但是你会读到不止一行,这意味着你对文件的后续访问将被关闭,除非你a)继续使用缓冲层b)倒带。并且b)并不总是可能的,因为不是所有的文件都是可倒带的。是的,这就是为什么我说的是静态缓冲区,在后续调用中重用它,并在获取新数据之前使用缓冲区中已经存在的行。也许需要做一些工作来确保close()和open()之间的可靠性,为不同的文件提供相同的fd,但我的观点是,这在技术上是可能的。使用静态缓冲区来保留数据是否有一个特别的问题?@deb0ch you解决方案在概念上等同于使用stdio。它还将您绑定到通过缓冲区访问fd的特定函数族,否则您的fd访问将与缓冲区不同步。