跳轉到內容

C 程式設計/stdio.h/fgets

來自華夏公益教科書,自由的教科書

fgets 是 C 程式語言中的一個函式,它從給定的檔案流源讀取有限數量的字元到字元陣列中。[1] fgets 代表 file get string。它包含在 C 標準庫標頭檔案 stdio.h 中。該函式的原型如下

char* fgets(char *string, int length, FILE * stream);

該函式在找到換行符或到達檔案末尾,或者讀取了 (length - 1) 個字元後停止讀取。如果遇到了換行符,它將作為最後一個字元包含在字串中,在空字元之前。長度引數包括用於追加到字串末尾的空字元所需的空格。因此,要讀取 N 個字元,長度說明必須指定為 N+1。如果至少讀取了一個字元並且沒有發生錯誤,則返回讀取的字串,否則返回 NULL 指標。

流引數指定要從中讀取字串的流。stdin 通常用於此處,用於從標準輸入讀取。否則,使用 fopen() 函式返回的 FILE * 值。

示例用法

[編輯 | 編輯原始碼]

以下程式碼從控制檯輸入讀取字元,並使用 puts 函式逐行列印 20 個字元,直到出現 EOF。

#include <stdio.h>

#define MAX_LEN 20

int main(void)
{
  char str_buf[MAX_LEN + 1]; // One extra byte needed
                             // for the null character

  while(fgets(str_buf, sizeof str_buf, stdin) != NULL)
	puts(str_buf);

  return 0;
}

在 POSIX 實用程式中的使用

[編輯 | 編輯原始碼]

為了符合 POSIX 實用程式行長度,定義 LINE_MAX(通常在 limits.h 中找到)通常用於設定字元緩衝區的大小。

fgets() 強制使用的固定緩衝區大小在需要處理任意長度文字行的應用程式中很麻煩。

符合 POSIX.1-2008-conforming 的系統提供了一個名為 getline() 的函式(最初是 GNU 擴充套件[2]),它將讀取整行,如果緩衝區不夠長,則重新分配緩衝區。[3]

高階應用程式可以使用 mmap 來避免緩衝區限制。

參考文獻

[編輯 | 編輯原始碼]
  1. ISO/IEC 9899:1999 規範 (PDF). p. 296, § 7.19.7.2.
  2. http://www.gnu.org/software/libc/manual/html_node/Line-Input.html#index-getline-993
  3. http://pubs.opengroup.org/onlinepubs/9699919799/functions/getline.html
[編輯 | 編輯原始碼]
華夏公益教科書