命名空间
变体
操作

fgets

来自 cppreference.cn
< c‎ | io
 
 
文件输入/输出
类型与对象
        
函数
文件访问
(C95)
非格式化输入/输出
(C95)(C95)
(C95)
(C95)(C95)
(C95)
(C95)

格式化输入
 
定义于头文件 <stdio.h>
char* fgets( char*          str, int count, FILE*          stream );
(until C99)
char* fgets( char* restrict str, int count, FILE* restrict stream );
(since C99)

最多从给定的文件流读取 count - 1 个字符,并将它们存储到 str 指向的字符数组中。如果在找到换行符时(在这种情况下 str 将包含该换行符)或发生文件结束符时,解析停止。如果读取了字节且未发生错误,则在写入 str 的最后一个字符之后的位置立即写入空字符。

目录

[编辑] 参数

str - 指向字符数组元素的指针
count - 要写入的最大字符数(通常是 str 的长度)
stream - 从中读取数据的文件流

[编辑] 返回值

成功时返回 str,失败时返回空指针。

如果遇到文件结束条件,则在 stream 上设置 eof 指示器(参见 feof())。如果这导致未读取任何字节,则仅当这是一个失败,在这种情况下,将返回空指针,并且 str 指向的数组的内容不会被更改(即,第一个字节不会被空字符覆盖)。

如果失败是由其他错误引起的,则在 stream 上设置error 指示器(参见 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 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) [编辑]
(removed in C11)(C11)
stdin 读取字符字符串
(function) [编辑]
将字符字符串写入文件流
(function) [编辑]
从流中读取到自动调整大小的缓冲区,直到分隔符/行尾
(function) [编辑]
C++ 文档 关于 fgets