2015-12-03 46 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