c语言中fread,fgets等取文件字符的缓存空间小出现问题

news2024/11/25 0:38:14

一种奇怪现象

#include <stdio.h>
#include <stdlib.h>
#include<windows.h>

int main(void){
	int i;
	printf("hello\n");
	fflush(stdout);   //当没有这部刷新,hello会和end等到时间一起输出
	Sleep(2000);    //windowsa.h中的Sleep,表示暂停2s
	printf("end\n");
	return 0;
}

没有fflush刷新标准输出流,hello和end将最后同时输出,导致这种情况的原因是缓存

刷新缓存的情况

三种缓冲方式:无缓冲,行缓冲(遇到换行符执行),全换成冲(缓冲区满执行)

 1. 内存满时
 2. 换行符“\n”
 3. 调用fflush
 4. 程序结束

fgets缓存空间问题

其中默认读取n-1个字符和自动添加字符串结束符号\0

char *fgets(char *str, int n, FILE *stream)
str:字符数组指针,用于存放读取的字符;n:读取n-1个字符;stream:文件流指针

下面主要测试存放的缓存字符数组和字符个数关系导致的输出不同情况,设缓存字符数组大小为m,字符流文本是1到9字符

当m>=n时,都可以正常读取和显示

根据测试发现m=n-1时也是正常执行,相当于读取了m个字符将缓存填满,但按照解释应该有一个“\0”的字符在最后一位填充,

FILE *fp;
char buffer[5];  
fgets(buffer,4,fp);  
printf("fgets: %s\n",f_gets);   //这里的m=5,n=4,所以正常读取,显示123
printf("erro :%d\n",ferror(fp));  //这里错误检测是0

当m=n-1时,可以显示,但并不正确,会影响后来对文件流读取

第一种:fgets函数不进行赋值,文件流中的缓存被清空(个人通过猜测,不知道有没有大神能够解释),后面若想读入字符,需要从键盘输入读取

FILE *fp;
char buffer[5],re_gets[5];  
fgets(buffer,7,fp);
printf("fgets: %s\n",f_gets);   //这里的m=5,n=7,所以正常读取,显示12346
printf("erro :%d\n",ferror(fp));  //这里错误检测是0
fseek(fp,2,0);  //文件流指针指向第三个字符
fgets(re_gets,5,fp);  //这时候仿佛这个文件流fp被清空,若在cmd窗口,需要键盘输入才能执行
printf("fgets: %s\n",re_gets);

第二种:fgets函数进行赋值,文件流不被清空,后面的取得数据仍可以从文件流读取

FILE *fp;
char buffer[5],re_gets[5],*ret_gets;    //添加ret_gets做为fgets的返回值
fgets(buffer,7,fp);
printf("fgets: %s\n",f_gets);   //这里的m=5,n=7,所以正常读取,显示12346
printf("erro :%d\n",ferror(fp));  //这里错误检测是0
fseek(fp,2,0);
ret_gets = fgets(re_gets,5,fp);  //!!!和上面的不同
printf("re_gets: %s\n",re_gets);   //这里显示3456

当m<=n-2时,fgets执行的语句直接报错

这时候程序不能向下执行,直接跳过后面的程序

fread读取需要注意的地方

printf输出字符串需要注意的地方:结尾是否有"\0",

#include <stdio.h>
#include <stdlib.h>

int main(void){

	char a[5]={'1','2','3','4','5'};
	char b[5]={'1','2','3','4','5'};
	printf("%p\n",a);  //000000000061FE1B
	printf("%p\n",b);  //000000000061FE16
	printf("%s\n",b);  //1234512345p
	return 0;
}

在这里插入图片描述
所以下面的程序中就出现了这种显示问题

#include <stdio.h>
#include <stdlib.h>

int main(void){
	FILE *fp;
	char f_getc,f_gets[5],*f_gets_return,f_read[4];
	
	fp = fopen("file.txt","r");

	rewind(fp);   //重移动文件指针到最开始
	f_gets_return=fgets(f_gets,6,fp);  //这里不用赋值语句,文件流会清空,这里的“一定”要是一个字符串数组
	printf("fgets: %s\n",f_gets);  //得到n-1个字符,最后一个自动填充\0

	rewind(fp);
	fread(f_read,sizeof(char),4,fp);
	printf("fread:  %s\n",f_read);

	fclose(fp);
	return 0;
}

在这里插入图片描述
对读取的字符个数调整,fread(f_read,sizeof(char),3,fp);,就得到下面的结果
在这里插入图片描述

结果分析

fgets的函数调用中,读取的数据会比第二个参数少1,而fread读取的字符数量和第三个参数的数量一样。通过这些判断缓存中是否存放了字符结束符。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/86749.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

某研究生不写论文竟研究起了算命?

起因 大约一个月前&#xff0c;在学校大病一场&#xff08;不知道是不是&#x1f411;了&#xff0c;反正在学校每天核酸没检测出来&#xff09;在宿舍休息了整整一周。当时因为发烧全身疼所以基本一直躺着刷刷视频。看了一周倪海厦老师讲的天纪&#xff0c;人纪感悟颇多&…

央企招聘:中国航空油料集团2023公开招聘

一、公司简介 中国航空油料集团有限公司&#xff08;以下简称“中国航油”&#xff09;成立于2002年10月11日&#xff0c;是以原中国航空油料总公司为基础组建的国有大型航空运输服务保障企业&#xff0c;是国内最大的集航空油品采购、运输、储存、检测、销售、加注为一体的航…

Spring Boot打成jar包后运行及配置文件的问题

Maven打包 因为Spring Boot项目内置Tomcat&#xff0c;所以可以打成一个jar包直接运行&#xff0c;而不必再需要安装Tomcat了。 如果用IDEA打包&#xff0c;还得先添加Artifacts&#xff1a; 然后再选择‘Main Class’ 显然比较麻烦&#xff0c;而且每次导入项目都得重新添加…

高频功率放大器工作原理总结(高频和低频功率放大器的区别)

高频功率放大器处在发射机的末级&#xff0c;主要作用是把高频已调拨信号进行功率放大&#xff0c;满足发送功率的要求&#xff0c;然后通过天线辐射到空间&#xff0c;保证一定区域接收机能够接收到信号电平。 高频功率放大器是通信系统中发送装置的组件&#xff0c;按照频带的…

【DOTS学习笔记】Cache层级结构与排队管理

目录前言如何理解L1,L2,L3级缓存的树形结构设计排队的烦恼现实中的排队烦恼计算机程序设计中的排队队列类型前言 本文是Metaverse大衍神君的《DOTS之路》系列课程的学习笔记 如何理解L1,L2,L3级缓存的树形结构设计 排队的烦恼 现实中的排队烦恼 这是一张关于排队的图&#xf…

论文速递:AAAI 2023 | 优图16篇论文速览,含多标签分类、姿态估计、目标检测、HOI、小样本学习等研究方向

近日&#xff0c;AAAI 2023&#xff08;Association for the Advancement of Artificial Intelligence&#xff09;国际先进人工智能协会公布了录用结果&#xff0c;本届会议共有8777篇投稿&#xff0c;录用1721篇&#xff0c;录用率19.6%。 AAAI是人工智能领域的主要学术组织之…

[go 语言学习笔记] 7天用Go从零实现分布式缓存GeeCache 「持续更新中」

说明 本文用于记录学习 go 语言过程中的笔记, 文中的代码都是在文本中敲出来的伪代码, 并不能直接运行, 如有需要可以参考原文链接. 本文的整体思路是对原系列教程阅读后的复盘. 关于本文参考的 学习教程 可以访问原教程链接: 7天用Go从零实现分布式缓存GeeCache 本文如有…

文本检测识别技术在合合信息的应用实务解决方案

合合信息保险行业全业务流程数字化解决方案 合合信息依托AI大数据&#xff0c;打造了保险行业全业务流程数字化解决方案&#xff1a;OCR智能分类识别文档、表格、卡证、票据、合同等&#xff0c;替代人工录入&#xff0c;图像智能质检优化&#xff0c;实现投保、核保、理赔、合…

(Matlab实现)基于蒙特卡洛模拟的大规模电动车充电模型

目录 摘要&#xff1a; 1电动车日行驶里程概率分布&#xff1a; 2.电动车充电起始时间概率分布&#xff1a; 3.大规模电动车充电行为蒙特卡洛建模&#xff1a; 3.1日行驶里程 3.2开始充电时间 3.3耗电量 3.4充电时间 3.5总充电负荷 4.不同规模的电动车的充电负荷曲线…

vue中vue-router安装与配置方法步骤详解

vue-router 是 vue.js 官方的路由插件&#xff0c;里面组件和 URL 的映射关系由 vue-route 帮我们管理。 在 vue-router 的单页面应用中&#xff0c;页面的路径的改变就是组件的切换。 第一步&#xff1a; 1.正常初始化项目的时候&#xff0c;会有个 vue-router 供我们选择。…

docker安装kafka、zookeeper

docker安装kafka、zookeeper 基于win10&#xff0c;docker desktop 基于linux也是一样的处理方式 (win10通过Docker搭建LNMP环境全流程)[https://blog.csdn.net/fendouweiqian/article/details/128062543] docker安装kafka、zookeeper 创建共享网络 为的是容器内可以通讯 …

vue-cli-3环境搭建和配置

一、vue 是单文件组件 之前注册组件有什么缺点 ? 1- 缺乏语法高亮 2-格式不好 3-没有专门的写css代码等等 参考 : vue > 工具 > 单文件组件 什么是单文件组件 &#xff1a;后缀为 .vue 的文件 单文件组件的三个组成部分 (代码块 : scaffold 自动提示) template (模…

21. 合理的模型初始化和激活函数

1. 让训练更加稳定 2. 让每层的方差是一个常数 以两个变量为例&#xff0c;均值为零可以让变量于自己的轴对称&#xff0c;那么在二维上整个变量分布就是中心对称&#xff0c;而方差则可以控制各个变量离原点的离散程度&#xff0c;那么就可以把二维变量看成限制在某个圈内。 在…

物联网开发笔记(61)- 使用Micropython开发ESP32开发板之控制3.2寸触摸屏的SD卡(续)

一、目的 这一节我们学习如何使用我们的ESP32开发板来控制3.2寸触摸屏的SD卡。 关键字&#xff1a;3.2寸SPI串口TFT液晶显示屏模块 ILI9341驱动 LCD触摸屏 240*320 XPT2046触摸屏芯片IC 二、环境 ESP32 3.2寸触摸屏SD卡模块 Thonny IDE 几根杜邦线 接线方法&#xff1a; …

[附源码]计算机毕业设计的中点游戏分享网站Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; Springboot mybatis MavenVue等等组成&#xff0c;B/S模式…

一篇文章带你深入了解JavaScript中let+var的特性

暂时性死区 上篇文章我们了解到了let和var之间的细微差别&#xff0c;同时它们之间还有一个区别就是let声明的变量不会在作用域中被提升 <script> //name会被提升console.log(name); //undefinedvar name "Matt"; ​//age不会被提升console.log(age); //…

5.Naocs系列之集群部署

本文学习nacos基于docker的集群部署 1. 新增mysql8 Dockerfile文件 // online/shenjian/nacos/nacosCluster/image/mysql FROM mysql:8.0.30 ADD https://raw.githubusercontent.com/alibaba/nacos/develop/distribution/conf/mysql-schema.sql /docker-entrypoint-initdb.d/…

极客时间Kafka - 13 Kafka 中的高水位和 Leader Epoch 机制

文章目录1. 什么是高水位&#xff1f;2. 高水位的作用3. 高水位更新机制1. Leader 副本高水位更新机制2. Follower 副本高水位更新机制4. 副本同步机制解析5. Leader Epoch你可能听说过高水位&#xff08;High Watermark&#xff09;&#xff0c;但不一定耳闻过 Leader Epoch。…

vxe-table 实现表格填写自动计算且限制数值的复杂操作

vxe-table 实现表格填写自动计算且限制数值复杂操作 效果 演示思路 输入框设置最大值 :max"row.max"输入框调用方法blur"updateFooterEvent(row, $event)" input" if (row[item.field] > row.max) { row[item.field] row.max; } " 上代码…

我们是如何追逐元宇宙、XR等“概念股”浪潮的?

作者&#xff1a;金擘(渚薰) 1.今年我们迈出的第一步 随着淘宝人生小屋项目的正式上线&#xff0c;淘宝人生今年的元宇宙规划初步成型。 加上在 S1 同淘宝直播团队的合作上线的 Disney 毛毛狂欢馆&#xff0c;我们也正式迈出了“元宇宙”技术的第一步。 今年是淘宝人生上线 3…