[英]What is this ssize_t getline(char **lineptr, size_t *n, FILE *stream); function?
When I was looking at the C++ std::getline
function in <string>
, I accidently run man getline
in my Ubuntu Terminal I found this function:
ssize_t getline(char **lineptr, size_t *n, FILE *stream);
我知道這與std::getline
完全不同。 它們恰好具有相同的 function 名稱。
APUE和Linux 編程接口均未提及此 function。 但它屬於標准 C 庫( #include <stdio.h>
)。
我確實閱讀了描述,它似乎只是一個getline
function 將字節存儲到動態緩沖區/內存中。 除此之外沒有什么特別的。
有人能告訴我這個 function 的主要用途是什么嗎? 它有什么特別之處? 嘗試了谷歌,但一無所獲。
這個 function 沒有什么特別之處。 POSIX指定從stream
中讀取單個以換行符分隔的行,並將其讀取到地址由lineptr
給出的緩沖區中,並且該緩沖區必須足夠大以容納n
個字節。
lineptr
和n
是指針的原因是它們既用作 function 的輸入,也可能用作 output 的輸入。 如果lineptr
在入口處是NULL
,或者n
表示它的大小太小而無法容納從stream
讀取的行,那么getline
(重新)分配一個緩沖區並使用相應的信息更新lineptr
和n
。
getline
比fgets
更容易使用,因為后者將在到達緩沖區末尾時停止讀取。 因此,如果fgets
嘗試讀取比提供的緩沖區更長的行,它將返回部分讀取,調用者將不得不再次讀取並連接多個部分。 在這種情況下, getline
將重新分配提供的緩沖區(如果有)。
標准 C 具有執行此操作的功能,但它們不是很安全: null 字符甚至(for
gets
)長行都會混淆它們。 因此 GNU C 庫提供了非標准的getline
function,可以輕松可靠地讀取行。
( getline
起源於 GNU C 庫,並在 2008 版中添加到 POSIX。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.