笔记:fgets函数详解

对fgets函数的一些测试:

char *fgets(char *s, int size, FILE *stream);

它的功能是从 stream 流中读取 size 个字符存储到字符指针变量 s 所指向的内存空间。它的返回值是一个指针,指向字符串中第一个字符的地址。
其中:s 代表要保存到的内存空间的首地址,可以是字符数组名,也可以是指向字符数组的字符指针变量名。size 代表的是读取字符串的长度。stream 表示从何种流中读取,可以是标准输入流 stdin,也可以是文件流,即从某个文件中读取

一、 每次调用读取的字符个数

file.txt

hello world!
fight for the better future!

test1.c

#include <stdio.h>
#include <stdlib.h>//exit
#include <strings.h>//bzero
int main()
{
	FILE* fp;
	if(NULL == (fp = fopen("file.txt","r")))
	{
		printf("打开文件失败!");
		exit(-1);
	}

	char buf[10] = "\0";
	int count = 0;
	while(NULL != fgets(buf,sizeof(buf),fp))
	{
		count++;
		printf("%s",buf);
		bzero(buf,sizeof(buf));
		printf("|第%d次循环|",count);
	}
	return 0;
}

结果分析:

在这里插入图片描述

  • 假设fgets函数的参数2为 n(n个字节),读取文件流fp时从文件首开始,在不遇到换行时,每调用一次调用读取得到 n-1 个有效字符,fgets 函数自动在读的 n-1个字符后面添加 ‘\0’ ,共保存 n 个字符到参数1
  • 下一次调用 fgets 函数时,从上次读取结束的位置继续读取,如果在读取的前 n-1 个字符时遇到换行,则本次读取到换行符为止,同时仍然在换行符后面添加 ‘\0’ ,一并保存到参数1
二、 关于覆盖的问题

file.txt

hello world!
fight
for the better future!

test2.c

#include <stdio.h>
#include <stdlib.h>
#include <strings.h>
int main()
{
	FILE* fp;
	if(NULL == (fp = fopen("file.txt","r")))
	{
		printf("打开文件失败!");
		exit(-1);
	}

	char buf[20] = {'\0'};

	fgets(buf,sizeof(buf),fp);
	int i;
	for(i=0;i<20;i++)
	{
		printf("|%c|-",buf[i]);
	}
	printf("到这里\n\n");
//	bzero(buf,sizeof(buf));

	fgets(buf,sizeof(buf),fp);
	for(i=0;i<20;i++)
	{
		printf("|%c|-",buf[i]);
	}
	return 0;
}

结果分析:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zUon9GZ2-1659097180913)(C:\Users\Pioneer\AppData\Roaming\Typora\typora-user-images\image-20220729200141182.png)]

  • 如果不再第一次输出后清空buf,第二次保存时进来时,buf中仍有上一次读取时保存的字符
  • 取消bzero函数的注释后运行结果如下:

..(img-zUon9GZ2-1659097180913)]

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值