跳转到内容

C 编程/stdio.h/fgets

来自维基教科书,自由的教科书

fgets 是 C 编程语言中的一个函数,它从给定的文件流源读取有限数量的字符到字符数组中。[1] fgets 代表 file get string。它包含在 C 标准库头文件 stdio.h 中。该函数的原型如下

char* fgets(char *string, int length, FILE * stream);

该函数在找到换行符或到达文件末尾,或者读取了 (length - 1) 个字符后停止读取。如果遇到了换行符,它将作为最后一个字符包含在字符串中,在空字符之前。长度参数包括用于追加到字符串末尾的空字符所需的空格。因此,要读取 N 个字符,长度说明必须指定为 N+1。如果至少读取了一个字符并且没有发生错误,则返回读取的字符串,否则返回 NULL 指针。

流参数指定要从中读取字符串的流。stdin 通常用于此处,用于从标准输入读取。否则,使用 fopen() 函数返回的 FILE * 值。

示例用法

[编辑 | 编辑源代码]

以下代码从控制台输入读取字符,并使用 puts 函数逐行打印 20 个字符,直到出现 EOF。

#include <stdio.h>

#define MAX_LEN 20

int main(void)
{
  char str_buf[MAX_LEN + 1]; // One extra byte needed
                             // for the null character

  while(fgets(str_buf, sizeof str_buf, stdin) != NULL)
	puts(str_buf);

  return 0;
}

在 POSIX 实用程序中的使用

[编辑 | 编辑源代码]

为了符合 POSIX 实用程序行长度,定义 LINE_MAX(通常在 limits.h 中找到)通常用于设置字符缓冲区的大小。

fgets() 强制使用的固定缓冲区大小在需要处理任意长度文本行的应用程序中很麻烦。

符合 POSIX.1-2008-conforming 的系统提供了一个名为 getline() 的函数(最初是 GNU 扩展[2]),它将读取整行,如果缓冲区不够长,则重新分配缓冲区。[3]

高级应用程序可以使用 mmap 来避免缓冲区限制。

参考文献

[编辑 | 编辑源代码]
  1. ISO/IEC 9899:1999 规范 (PDF). p. 296, § 7.19.7.2.
  2. http://www.gnu.org/software/libc/manual/html_node/Line-Input.html#index-getline-993
  3. http://pubs.opengroup.org/onlinepubs/9699919799/functions/getline.html
[编辑 | 编辑源代码]
华夏公益教科书