名稱空間
變體
操作

fgets

來自 cppreference.com
< c‎ | io
 
 
檔案輸入/輸出
型別和物件
        
函式
檔案訪問
(C95)
非格式化輸入/輸出
(C95)(C95)
(C95)
(C95)(C95)
(C95)
(C95)

格式化輸入
 
定義於標頭檔案 <stdio.h>
char* fgets( char*          str, int count, FILE*          stream );
(直到 C99)
char* fgets( char* restrict str, int count, FILE* restrict stream );
(C99 起)

從給定檔案流中最多讀取 count - 1 個字元,並將它們儲存在由 str 指向的字元陣列中。如果遇到換行符(在這種情況下,str 將包含該換行符)或遇到檔案結束,則解析停止。如果讀取了位元組且未發生錯誤,則在寫入 str 的最後一個字元之後的立即位置寫入一個空字元。

目錄

[編輯] 引數

str - 指向字元陣列元素的指標
count - 要寫入的最大字元數(通常是 str 的長度)
stream - 從中讀取資料的檔案流

[編輯] 返回值

成功時返回 str,失敗時返回空指標。

如果遇到檔案結束條件,則在 stream 上設定 *eof* 指示器(參見 feof())。僅當這導致沒有讀取任何位元組時才算失敗,在這種情況下返回空指標,並且由 str 指向的陣列內容不變(即第一個位元組未被空字元覆蓋)。

如果失敗是由其他錯誤引起的,則在 stream 上設定 *error* 指示器(參見 ferror())。由 str 指向的陣列內容是不確定的(甚至可能不是以 null 結尾)。

[編輯] 注意

POSIX 額外要求如果發生讀取錯誤,fgets 會設定 errno

儘管標準規範在 count <= 1 的情況下不明確,但常見實現會:

  • 如果 count < 1,不執行任何操作,報告錯誤,
  • 如果 count == 1
  • 一些實現不執行任何操作,報告錯誤,
  • 其他實現不讀取任何內容,將零儲存在 str[0] 中,報告成功。

[編輯] 示例

#include <stdio.h>
#include <stdlib.h>
 
int main(void)
{
    FILE* tmpf = tmpfile();
    fputs("Alan Turing\n", tmpf);
    fputs("John von Neumann\n", tmpf);
    fputs("Alonzo Church\n", tmpf);
 
    rewind(tmpf);
 
    char buf[8];
    while (fgets(buf, sizeof buf, tmpf) != NULL)
          printf("\"%s\"\n", buf);
 
    if (feof(tmpf))
       puts("End of file reached");
}

輸出

"Alan Tu"
"ring
"
"John vo"
"n Neuma"
"nn
"
"Alonzo "
"Church
"
End of file reached

[編輯] 參考

  • C23 標準 (ISO/IEC 9899:2024)
  • 7.21.7.2 The fgets function (p: TBD)
  • C17 標準 (ISO/IEC 9899:2018)
  • 7.21.7.2 The fgets function (p: 241)
  • C11 標準 (ISO/IEC 9899:2011)
  • 7.21.7.2 The fgets function (p: 331)
  • C99 標準 (ISO/IEC 9899:1999)
  • 7.19.7.2 The fgets function (p: 296)
  • C89/C90 標準 (ISO/IEC 9899:1990)
  • 4.9.7.2 The fgets function

[編輯] 另請參見

stdin、檔案流或緩衝區讀取格式化輸入
(function) [編輯]
(在 C11 中移除)(C11)
stdin 讀取一個字串
(function) [編輯]
將字元字串寫入檔案流
(function) [編輯]
從流中讀取到自動調整大小的緩衝區,直到分隔符/行尾
(function) [編輯]
C++ 文件 for fgets