2015-12-03 107 views
5

据我所知,没有与getline()等效的文件描述符的libc,而不是与FILE *一起使用。带文件描述符而不是文件指针的getline()

是否有(技术)原因呢?

+1

'getline'不是来自C标准,我想你是指POSIX功能? –

+0

术语文件描述符是非常主观的,它可以是从IOFile到套接字的任何事物。所以读取的行可能不是一个正确的方法来实现,除非它非常相关的文件 –

回答

7

您可以使用fdopen从filedescriptor中创建FILE流。

要一般地从文件描述符中获取一行,您需要一次向操作系统请求一个字符,而且效率非常低。 (POSIX shell中的read内置工作就像这样 - 它通过一次检索一个字节来非常低效地读取行)。

FILE流批量询问OS的数据,这会提高效率,但文件描述符可能不会是一个可回退的文件 - 它可能是一个套接字或一个管道,如果要求输入100个字符,并且该100个批处理的第三个字符是换行符,则无法一般性地撤消97个字符之后的读取。

+0

你不需要一次询问操作系统一个字符,一个简单的实现是可以使用静态缓冲区一次获取多个字节正如你想要的操作系统。 这实际上是我在Epitech学习的一所学校的编码练习,名为get_next_line。我相信你可以在GitHub上找到很多这个名字的学生项目。 请注意,如果你想使用其中的一个,你应该得到一个将文件描述符保存在一个数组中以便能够一次处理多个文件的文件描述符。 – deb0ch

+1

@ deb0ch当然。但是,那么您将阅读的不仅仅是一行,这意味着您对该文件的后续访问将关闭,除非您a)继续使用缓冲层b)倒带。和b)并不总是可能的,因为并非所有文件都是可回放的。 – PSkocik

+0

是的,这就是为什么我正在谈论静态缓冲区,以便在后续调用中重用它,并在获取新数据之前消耗缓冲区中已有的行。可能需要做一些工作才能在close()和open()之间保证可靠性,以便为不同的文件提供相同的fd,但我的观点只是它*在技术上是可行的。 – deb0ch