使用文件描述符而不是文件指针的getline()函数

11

据我所知,目前没有类似于getline()的libc函数可以使用文件描述符(file descriptor),而不是使用FILE *来操作文件。

这个问题有任何(技术)原因吗?


1
getline 不是 C 标准中的函数,我猜你指的是 POSIX 特性? - Jens Gustedt
术语“文件描述符”非常主观,它可以是从IOFile到socket的任何东西。因此,除非与文件相关密切相关,否则“读取行”可能不是一种正确的实现方法。 - asio_guy
1个回答

15
你可以使用 fdopen 将文件描述符创建成一个 FILE 流。
要从文件描述符中通用地获取一行,你需要逐个字符地向操作系统请求数据,这非常低效。(POSIX shell 中的 read 内建命令就是这样工作的——它通过逐字节检索来非常低效地读取行。)
FILE 流批量向操作系统请求数据,这提高了效率,但文件描述符可能不是可倒带的文件——它可能是套接字或管道,如果你请求 100 个字符并且这 100 个字符的第三个字符是换行符,那么在此之后的 97 个字符无法被通用地撤销读取。

1
你不需要一次一个字符地询问操作系统,可以使用静态缓冲区实现简单的获取任意数量字节的功能。 这实际上是我在Epitech学习时的编程练习,名为get_next_line。我相信你可以在GitHub上找到很多以此命名的学生项目。 请注意,如果您想使用其中之一,应选择将文件描述符存储在数组中以便能够同时处理多个文件的版本。 - deb0ch
1
@deb0ch 当然可以。但是这样你将会读取超过一行的内容,这意味着你后续对文件的访问将会出错,除非你 a) 继续使用缓冲层 b) 倒回去。而且 b) 并不总是可行的,因为并不是所有的文件都可以倒回去。 - Petr Skocik
1
是的,这就是为什么我在谈论静态缓冲区,以便在后续调用中重复使用它,并在获取新数据之前消耗已经存在于缓冲区中的行。也许需要一些工作来使其在close()和open()之间可靠地给出相同的fd以用于不同的文件,但我的观点只是它在技术上是可能的。 - deb0ch
1
你是否考虑过使用静态缓冲区来保留数据时可能会遇到的特定问题? - deb0ch
1
@deb0ch,你的解决方案在概念上等同于使用stdio。它还将你绑定到一组特定的函数家族,这些函数通过缓冲区访问fd,否则你的fd访问将与缓冲区不同步。 - Petr Skocik

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接