Namespaces
Variants

fgets

From cppreference.net
< c ‎ | io
定义于头文件 <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 所指数组的内容保持不变(即首个字节不会被空字符覆盖)。

若失败由其他错误引起,则设置流上的 错误 指示器(参见 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("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 fgets 函数 (页: TBD)
  • C17 标准 (ISO/IEC 9899:2018):
  • 7.21.7.2 fgets 函数 (页: 241)
  • C11 标准 (ISO/IEC 9899:2011):
  • 7.21.7.2 fgets 函数 (p: 331)
  • C99标准(ISO/IEC 9899:1999):
  • 7.19.7.2 fgets函数(页码:296)
  • C89/C90 标准 (ISO/IEC 9899:1990):
  • 4.9.7.2 fgets 函数

参考

stdin 、文件流或缓冲区读取格式化输入
(函数)
(C11中移除) (C11)
stdin 读取字符串
(函数)
向文件流写入字符串
(函数)
从流读取数据到自动调整大小的缓冲区,直到遇到分隔符/行结束
(函数)
C++ 文档 for fgets