fgets
来自 cppreference.cn
定义于头文件 <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
[编辑] 另请参见
(C11)(C11)(C11) |
从 stdin、文件流或缓冲区读取格式化输入 (function) |
(在 C11 中移除)(C11) |
从 stdin 读取一个字符串 (function) |
将字符字符串写入文件流 (function) | |
(动态内存 TR) |
从流中读取到自动调整大小的缓冲区,直到分隔符/行尾 (function) |
C++ 文档 for fgets
|