Namespaces
Variants

fgets

来自 zh.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