【C语法学习】7 - fgets()函数

文章目录

  • 1 函数原型
  • 2 参数
  • 3 返回值
  • 4 读取机制
  • 5 比较
  • 6 示例
    • 6.1 示例1
    • 6.2 示例2
    • 6.3 示例3

1 函数原型

fgets():从指定流stream读取一个字符串存储到str指向的内存空间,函数原型如下:

char *fgets( char *str, int n, FILE *stream );

2 参数

fgets()函数有三个参数str、n和stream:

  1. str是一个指向char类型的指针,即str可以是一个字符指针变量名,也可以是一个字符数组名;
  2. n是读取的最大字符数(包括最后的空字符’\0’),类型为int型;把n设置为str指向内存空间的字节数,可防止内存访问越界;
  3. 参数stream是一个指向FILE类型结构的指针;stream指定了fgets()函数要读取的流,可以是文件流,也可以是标准输入流;当是文件流时,stream等于fopen()函数的返回值;当是标准输入流时,stream等于stdin。

3 返回值

fgets()函数的返回值类型是一个指向char类型的指针:

  1. 读取成功,返回str;
  2. 读取失败,返回NULL。

C语言标准描述如下:

1. Each of these functions returns its argument if successful. 
2. A NULL pointer indicates an error or end-of-file condition. 

4 读取机制

fgets()函数从指定流stream中读取字符,直至:

  1. 遇到换行符’\n’;
  2. 遇到文件结束符EOF;
  3. 读取n-1个字符。

以上三种情况任意一个满足,fgets()函数停止读取字符,并在已读取字符末尾添加空字符’\0’,作为字符串结束符。

5 比较

fgets()函数和gets()函数的工作原理类似,差异如下:

  1. fgets()函数从指定流stream中读取一行字符;
  2. gets()函数从标准输入流stdin中读取一行字符;
  3. 相比gets()函数,fgets()函数遇到换行符’\n’时,会保留换行符’\n’,并在其后添加空字符’\0’;
  4. 相比gets()函数,fgets()函数指定读取的最大字符数n,可防止内存访问越界;
  5. 可将fgets()函数的参数stream指定为stdin,则fgetc()函数的功能和getchar()函数的功能基本相同(差异见第3点对于换行符’\n’的处理上)。

问题思考:为什么fgets()函数会保留换行符’\n’?

  1. 个人理解:fgets()函数主要用于读文件,而换行符是文件行的一部分,必须保留。

6 示例

6.1 示例1

比较gets()函数和fgets()函数对换行符’\n’的处理,示例代码如下所示:

int main()
{
   char str1[20] = { 0 };
   char str2[20] = { 0 };

   int  len1 = 0;
   int  len2 = 0;   
   //
   printf("请输入字符串 :\n");
   gets(str1);
   puts(str1);
   printf("Length of str1 = %d\n", strlen(str1));
   //
   printf("\n");
   //
   printf("请输入字符串 :\n");
   fgets(str2, 20, stdin);
   puts(str2);
   printf("Length of str2 = %d\n", strlen(str2));
   //
   printf("\n");

   return 0;
}

代码运行结果如下图所示:

【C语法学习】7 - fgets()函数_第1张图片

代码及运行结果分析:

  1. 字符数组str1各元素内容如下图所示。
    【C语法学习】7 - fgets()函数_第2张图片
  2. 字符数组str2各元素内容如下图所示.
    【C语法学习】7 - fgets()函数_第3张图片

6.2 示例2

fgets()函数读文件,文件中行长度小于n,示例代码如下所示:

int main()
{
   char str[20] = { 0 };

   FILE* fp;
   //打开文件
   if ((fp = fopen("1.txt", "r")) == NULL)
   {
      printf("Failed to open file\n");
      exit(1);
   }
   //读第一行
   fgets(str, 20, fp);
   printf("%s", str);
   //读第二行
   fgets(str, 20, fp);
   printf("%s\n", str);
   //关闭文件
   fclose(fp);

   return 0;
}

文件内容如下图所示:
在这里插入图片描述

代码运行结果如下图所示:

在这里插入图片描述

代码及运行结果分析:

  1. 第一次调用fgets()函数,遇到换行符’\n’结束,使用printf()函数打印时无需换行;
  2. 第二低调用fgets()函数,遇到文件结束符EOF结束,使用printf()函数打印时需加换行。

6.3 示例3

fgets()函数读文件,文件中行长度大于n,示例代码如下所示:

int main()
{
   char str[20] = { 0 };
   int len = 0;
   FILE* fp;
   //打开文件
   if ((fp = fopen("2.txt", "r")) == NULL)
   {
      printf("Failed to open file\n");
      exit(1);
   }
   //读第一行
   fgets(str, 10, fp);
   puts(str);
   printf("Length of str = %d\n\n", strlen(str));
   //读第二行
   fgets(str, 10, fp);
   puts(str);
   printf("Length of str = %d\n\n", strlen(str));
   //读第三行
   fgets(str, 10, fp);
   puts(str);
   printf("Length of str = %d\n\n", strlen(str));
   //关闭文件
   fclose(fp);

   return 0;
}

文件内容如下图所示:

在这里插入图片描述

代码运行结果如下图所示:

【C语法学习】7 - fgets()函数_第4张图片

代码及运行结果分析:

  1. 第一次调用fgets()函数,文件行长度(26)大于n(10),读取9个字符"ABCDEFGHI"+空字符’\0’共10个字符写入字符数组str中,使用puts()函数打印时自动换行;
  2. 第二次调用fgets()函数,文件行长度(17)大于n(10),读取9个字符"JKLMNOPQR"+空字符’\0’共10个字符写入字符数组str中,使用puts()函数打印时自动换行;
  3. 第三次调用fgets()函数,文件行长度(8)小于n(10),遇到文件结束符EOF结束,读取8个字符"STUVWXYZ"+空字符’\0’共9个字符写入字符数组str中,使用puts()函数打印时自动换行。

你可能感兴趣的:(C语言语法基础,c语言)