当前位置:网站首页>笔记:fgets函数详解
笔记:fgets函数详解
2022-07-29 20:49:00 【摁回车的大雷】
对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;
}
结果分析:
- 如果不再第一次输出后清空buf,第二次保存时进来时,buf中仍有上一次读取时保存的字符
- 取消bzero函数的注释后运行结果如下:
边栏推荐
- 第3章业务功能开发(线索关联市场活动,动态搜索)
- 第二好PyTorch新手课程;论文写作指南;使用µGo语言开发迷你编译器;超高效使用Transformer的扩展库;前沿论文 | ShowMeAI资讯日报
- TCP协议详解
- 《张卫国的夏天》欢乐来袭,黄磊、刘奕君携手演绎“冤种”兄弟
- 组合模式(Composite Pattern)
- 什么是数据安全性?
- Cobaltstrike和BurpSuite桌面快捷配置
- LeetCode--single linked list--146.LRU cache
- Cooler Navigation helps you shop easily in shopping malls without confusion
- Minimal jvm source code analysis
猜你喜欢
干货!联邦学习中的合作均衡
240. Searching 2D Matrix II
博世集团启动量子数字孪生计划
初识网络的简单概念
微信小程序 31 分包机制
4. Implementation Guide for GET_ENTITYSET Method of SAP ABAP OData Service Data Provider Class
940. 不同的子序列 II
Cooler Navigation helps you shop easily in shopping malls without confusion
亚马逊登录参数metadata1,encryptedPwd逆向分析
VR直播营销需求增加,数据模块为我们铺路
随机推荐
【AD】【持续更新ing】关于AD设计过程中一些小细节
C#笔记 之 Oracle.ManagedDataAccess包的安装及配置
SwiftUI * @State 相关问题
解析掌握现代化少儿编程实操能力
1. Promise usage in JS, 2. The concept and usage of closures, 3. The difference between the four methods and areas of object creation, 4. How to declare a class
Minimal jvm source code analysis
Use the PostgreSQL GRANT command to modify permissions on various database objects
7 行代码搞崩溃 B 站,原因令人唏嘘!
940. 不同的子序列 II
json-c实现json和结构体之间的相互转换
.NET 6.0中使用Identity框架实现JWT身份认证与授权
940. Different subsequences II
APM电机输出逻辑(Motors类详解)
mos管闩锁效应理解学习
378. 有序矩阵中第 K 小的元素
关于 golang 错误处理的一些优化想法
MySQL数据查询 - 联合查询
高通WLAN框架学习(31)-- Power save
分析少年派2中的Crypto
干货!联邦学习中的合作均衡