fgets

来自cppreference.com
< c‎ | io
 
 
文件输入/输出
类型与对象
函数
文件访问
直接输入/输出
无格式输入/输出
(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 - 指向 char 数组元素的指针
count - 写入的最大字符数(典型的为 str 的长度)
stream - 读取数据来源的文件流

返回值

成功时为 str,失败时为空指针。

若遇到文件尾条件导致了失败,则设置 stream 上的文件尾指示器(见 feof())。这仅若它导致未读取字符才是失败,该情况下返回空指针且不改变 str 所指向数组的内容(即不以空字符覆写首字节)。

若某些其他错误导致了失败,则设置 stream 上的错误指示器(见 ferror())。str 所指向的数组内容是不确定的(甚至可以不是空终止)。

注解

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("抵达文件尾");
}

输出:

"Alan Tu"
"ring
"
"John vo"
"n Neuma"
"nn
"
"Alonzo "
"Church
"
抵达文件尾

引用

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

参阅

stdin、文件流或缓冲区读取格式化输入
(函数)
(C11 中移除)(C11)
stdin 读取一个字符串
(函数)
将一个字符串写入文件流
(函数)
从流读入至动态改变大小的缓冲区,直到分隔符/行尾
(函数)