getline() 带有文件描述符而不是文件指针

Posted

技术标签:

【中文标题】getline() 带有文件描述符而不是文件指针【英文标题】:getline() with a file descriptor instead of a file pointer 【发布时间】:2016-03-07 22:50:58 【问题描述】:

据我所知,没有与getline() 等效的libc 可以使用文件描述符而不是FILE *

是否有(技术)原因?

【问题讨论】:

getline 不是来自 C 标准,我想您的意思是 POSIX 功能? 术语文件描述符是如此主观,以至于它可以是从 IOFile 到套接字的任何东西。所以读取行可能不是一个正确的实现方法,除非它与文件非常相关 【参考方案1】:

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

一般来说,要从文件描述符中获取一行,您需要一次向操作系统询问一个字符,这是非常低效的。 (POSIX shell 中的 read 内置函数就是这样工作的——它通过一次检索一个字节来读取行的效率非常低。)

FILE 流分批向操作系统请求数据,这提高了效率,但是文件描述符可能不是可回绕文件——它可能是套接字或管道,如果您要求 100 个字符和其中的第三个字符100 批是换行符,那么后面的 97 个字符的读取一般无法撤销。

【讨论】:

您不需要一次向操作系统询问一个字符,一个简单的实现是可以使用静态缓冲区一次从操作系统获取尽可能多的字节。这实际上是我在 Epitech 学习的学校的编码练习,名为 get_next_line。我相信你可以在 GitHub 上找到大量同名的学生项目。请注意,如果您想使用其中之一,您应该获得一个将文件描述符保存在一个数组中以便能够一次处理多个文件。 @deb0ch 当然。但是,您将阅读的不仅仅是一行,这意味着您对文件的后续访问将被关闭,除非您 a) 继续使用缓冲层 b) 倒带。并且 b) 并不总是可行的,因为并非所有文件都是可倒带的。 是的,这就是我谈论静态缓冲区的原因,以便在后续调用中重用它并在获取新数据之前使用缓冲区中已经存在的行。也许需要做一些工作才能使其在 close() 和 open() 之间为不同的文件提供相同的 fd 可靠,但我的观点是它 在技术上是可行的。 您是否考虑过使用静态缓冲区来保留数据的特定问题? @deb0ch 您的解决方案在概念上等同于使用 stdio。它还将您绑定到通过缓冲区访问 fd 的特定函数系列,否则您的 fd 访问将与缓冲区不同步。

以上是关于getline() 带有文件描述符而不是文件指针的主要内容,如果未能解决你的问题,请参考以下文章

我无法使用 cin.getline() 从用户那里获取 3 个字符串并使用指针数组来存储它们

C ++:带有空格的cin到没有getline函数的字符串

可以在循环中多次使用 getline() 吗? - Cython,文件读取

为啥有类级访问修饰符而不是对象级?

getline(cin,_string);

为啥我应该更喜欢 unsafe_unretained 限定符而不是为弱引用属性赋值? [复制]