Linux学习记录(五)-------三类读写函数

文章目录

    • 三种读写函数
      • 1.行缓存
      • 2.无缓存
      • 3.全缓存
      • 4.fgets和fputs
      • 5.gets和puts


三种读写函数

1.行缓存

遇到新行(\n),或者写满缓存时,即调用系统函数

  • 读:fgets,gets,printf,fprintf,sprintf
  • 写:fputs,puts,scanf

2.无缓存

只要调用这个函数就会将其内容写到内核中

stderr

3.全缓存

只有写满缓存再调用系统函数

  • 读:fread
  • 写:fwrite

4.fgets和fputs

char *fgets(char *s,int size,FILE *stream);/**@param--- s            缓存,即读到哪里去*@param--- size         读多少个字节*@param--- stream       从什么地方读*@return--- 若成功则为s(缓存的地址,若处于文件尾端或出错则为null)*/int fputs(const char *s,FILE *stream);
/**param ---s             缓存,即写什么内容*param ---stream        写到什么地方去*return    若成功则为非负值,若出错则为EOF-1*///eg打开一个空文件(或不存在的文件),用fputs写入Hello world 用fgets读出该文件的内容#include <stdio.h>
int main()
{FILE *fp;char str[128] = {0};fp = fopen("a.c","w+");if(fp == NULL){fprintf(stdout,"open filed\n");return -1;}fputs("hello world",fp);rewind(fp);//调整读写位置指针函数fgets(str,128,fp);//会将新行符存入缓存之中printf("str is %s\n",str);fclose(fp);return 0;
}

在这里插入图片描述
注:

刷新缓存函数 *ffluash(FIFE fp) 把库函数中的缓存内容强制写到内核中。

调整读写位置指针函数:

**fseek()参数与lseek()**是一样的但是返回值不一样

**lseek()**的返回值是:当前文件的位置指针值;

**fseek()**的返回值是:成功返回0,失败返回-11;

*rewind(FILE fp) 用于设定流的文件位置指示为文件开始,该函数调用成功无返回值。

rewind()等价于(void)fseek(fp 0, SEEK_SET)

*ftell(FILE fp) 用于取得当前的文件位置,调用成功则为当前文件位置指示,若出错则为-1L;

5.gets和puts

char *gets(char*s);
int puts(constchar *s);

gets 与fgets的区别:

  • gets()时不能指定缓存的长度,这样就可能造成缓存越界(如若该行长于缓存长度),写到缓存之后的存储空 间中,从而产生不可预料的后果;
  • gets()只能从标准输入中读;
  • gets()与fgets()的另一个区别是:gets()并不将新行符存入缓存中, fgets 将新行符存入缓存中;

puts 与fputs的区别:

  • puts()只能向标准输出中写;
  • puts()与fputs()的另一个区别是: puts 输出时会添加一个新行符,fputs不会添加;

fprintf、printf、sprintf 行缓存的函数

*int fprintf(FILE stream,”字符串格式”)

fprintf可以输出到文件中,也可输出到显示器, printf 只能输出到显示器中。

*intsprintf(str , “字符串格式”)

输出内容到一个字符串中

//e.g.打开一个空文件,用fprintf写入Hello World,然后读出其中内容
#include <stdio.h>int main()
{FILE *fp;char str[128] = {0};fp = fopen("a.c","w+");if(fp == NULL){fprintf(stdout,"open filed\n");return -1;}fprintf(fp,"hello world");rewind(fp);fgets(str,128,fp);printf("str is %s\n",str);fclose(fp);return 0;
}

在这里插入图片描述

//将一个浮点数传化成字符串形式输出
#include <stdio.h>int main()
{float a = 1.55;char str[20] = {0};sprintf(str,"a = %.2f",a);//将a转化成字符成形式输出到str中,可用于将不同形式的内容显示到屏幕上等printf("str is %s\n",str);return 0;
}

在这里插入图片描述

一个字符读写函数fgetc和fputc

fputs有缓存,但不是行缓存

int fgetc(FILE *fp)
/**description ---- 从文件中获取一个字符*param ---- 文件描述符*return 正确为读取的字符,到文件结尾或出错时返回EOF。*/
int fputc(int c, FILE *fp)
/**description---写一个字符到文件中*param---第一个参数为要写的字符,第二个参数为文件流*return 成功则返回输入的字符,出错返回EOF。*/

练习实现cat命令

#include <stdio.h>int main(int argc,char *argv[])
{if(argc != 2)//判断参数是否正确{printf("param failed\n");return -1;}char ret;//获取读取的字符FILE *fp;fp = fopen(argv[1],"r");//打开要显示的文档if(fp == NULL){printf("open failed\n");return -2;}while(1){ret = fgetc(fp);//读/*if(ret == EOF){break;}*/if(feof(fp)){break;}fputc(ret,stdout);//写}fclose(fp);return 0;
}

在这里插入图片描述

int feof(FILE *stream);
/**功能:判断是否已经到文件结束*参数:文件流*返回值:到文件结束,返回为非0,没有则返回0*/
int ferror(FILE *stream);
/**功能:判断是否读写错误*参数:文件流*返回值:是读写错误,返回为非0,不是则返回0*/
void clearerr(FILE *stream);
/**功能:清除流错误*参数:文件流*/

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Golang | Leetcode Golang题解之第328题奇偶链表

题目&#xff1a; 题解&#xff1a; func oddEvenList(head *ListNode) *ListNode {if head nil {return head}evenHead : head.Nextodd : headeven : evenHeadfor even ! nil && even.Next ! nil {odd.Next even.Nextodd odd.Nexteven.Next odd.Nexteven even.N…

贷齐乐系统sql注入漏洞

目录 源码 代码流程 payload编写 全局污染 php小特性 注入思路 payload构造 获取数据库名&#xff0c;这里是不可以使用database的因为括号被过滤乐 在information中查询数据库名 然后获取表名 获取数据 源码 <?php header("Content-type: text/html; char…

基于ssm+vue+uniapp的网上商城小程序

开发语言&#xff1a;Java框架&#xff1a;ssmuniappJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;M…

mac要装虚拟机吗

在Mac上安装虚拟机可以带来多种好处&#xff0c;‌但同时也存在一些潜在的影响。‌ 首先&#xff0c;‌虚拟机技术允许在同一设备上运行多个操作系统&#xff0c;‌这对于需要测试不同操作系统兼容性的开发者和IT专业人员来说非常有用。‌此外&#xff0c;‌虚拟机还能解决软件…

fastadmin自定义弹框,以及回调函数等问题,

效果图 1&#xff0c; 代码 弹框中使用弹框 弹框1代码主要代码 <div class"form-group ccol-xs-12 col-sm-2" style"text-align: right"><a href"#" data-url"{:url(user/add)}" class"btn btn-info" id"a…

【多线程】如何实现三个线程循环打印ABC

&#x1f970;&#x1f970;&#x1f970;来都来了&#xff0c;不妨点个关注叭&#xff01; &#x1f449;博客主页&#xff1a;欢迎各位大佬!&#x1f448; 文章目录 1. 如何实现三个线程顺序打印ABC1.1 详细要求描述1.2 使用join()1.3 实现代码1.4 运行结果 2. 如何实现三个线…

小白零基础学数学建模系列-Day6-微分方程模型基础与案例

文章目录 1 微分方程模型概述1.1 微分方程的基本概念和分类1.2 微分方程在科学计算中的重要性1.3 使用Python进行微分方程建模的优势 2 Python在微分方程建模中的应用2.1 常用Python库介绍2.2 Python的符号计算与解析解2.3 Python的数值计算与数值解 3 解微分方程的基本方法与P…

【大学物理】第7章 机械波,平面简谐波的方程,能流密度,惠更斯原理,波的叠加原理,波的干涉,驻波,多普勒原理(清华大学)

目录 7-1 波的基本概念 一、机械波产生的条件 二、横波和纵波 三、波线和波面 四、简谐波 五、物体的弹性形变* 1. 长变 2. 切变 3.容变 六、描述波动的几个物理量 1.波速 u 2.波动周期和频率 3.波长入 7.2 平面简谐波的方程 一、平面简谐波的波动方程 1.一…

即时通讯系统选型:如何为企业选择最佳的私有化即时通讯工具

在企业内部沟通和协作中&#xff0c;选择适合的即时通讯工具对于保障数据安全和提高工作效率至关重要。随着私有化即时通讯工具的出现&#xff0c;企业可以更好地掌握自身数据和系统&#xff0c;并提供更高的安全性和定制化能力。本文将为您提供一些指导&#xff0c;帮助企业选…

数学建模学习笔记

数学建模学习笔记 现学现卖&#xff0c;随缘更新QwQ 主要根据b站大师兄的视频整理而成&#xff0c;有不懂的可以去看原视频 List 数学建模学习笔记一、 层次分析法1.1 矩阵的一致性及其检验1.2 权重计算1.3 具体流程 二、模糊综合评测2.1 隶属函数2.2 隶属函数的确定方法2.3 模…

LeetCode 热题 HOT 100 (031/100)【宇宙最简单版】

【二叉树】No. 0437 路径总和 III【中等】&#x1f449;力扣对应题目指路 希望对你有帮助呀&#xff01;&#xff01;&#x1f49c;&#x1f49c; 如有更好理解的思路&#xff0c;欢迎大家留言补充 ~ 一起加油叭 &#x1f4a6; 欢迎关注、订阅专栏 【力扣详解】谢谢你的支持&am…

开发者账号验证难题,身份证居然不管用了!聊聊怎么搞定地址证明

最近不少开发者遇到了一个棘手的问题&#xff1a;Google Play的开发者账号验证突然变得更难了&#xff0c;尤其是身份证竟然不能再作为地址证明用了&#xff01; 今天分享一下开发者朋友们成功的经历和一些实用的小技巧&#xff0c;希望能帮大家顺利通过Google Play的身份验证。…

Redis的持久化的策略

Redis的持久化的策略 官方文档说明 AOF持久化策略RDB持久化的策略 AOF持久化策略 AOF持久性记录服务器接收到的每个写操作&#xff0c;然后&#xff0c;可以在服务器启动时再次重播这些操作&#xff0c;重建原始数据集&#xff0c;使用与Redis协议本身相同的格式记录命令。…

英语词汇量测试系统、英语学习系统

摘 要 随着信息技术和网络技术的飞速发展&#xff0c;人类已进入全新信息化时代&#xff0c;传统管理技术已无法高效&#xff0c;便捷地管理信息。为了迎合时代需求&#xff0c;优化管理效率&#xff0c;各种各样的管理系统应运而生&#xff0c;各行各业相继进入信息管理时代&…

Wireshark_DNS_v7.0

Wireshark_DNS_v7.0 一、 nslookup 前置 nslookup 是一个网络命令行工具&#xff0c;用于查询域名系统&#xff08;DNS&#xff09;中的域名解析记录。通过使用 nslookup&#xff0c;你可以获取某个域名的IP地址&#xff0c;或者获取与某个IP地址关联的域名信息。 查看域名…

Kafka + Kraft 集群搭建教程,附详细配置及自动化安装脚本

本文主要介绍 kafka kraft 搭建过程&#xff0c;主要用途是为了日志采集&#xff0c;所以搭建相对比较简单暴力&#xff0c;不过也可以作为一个参考供大家学习&#xff0c;主打一个能用管跑&#xff08;调优啊&#xff0c;参数解释啊&#xff0c;原理啊&#xff0c;太枯燥了&a…

Java高级面试题(二)-- JVM

Jvm虚拟机&#xff0c;运行在操作系统之上&#xff0c;编译执行java代码 1, 面试官&#xff1a;手绘一个类加载过程 补充&#xff1a; 这里的执行硬件 java 调用 c 指令 创建线程 &#xff0c;new thread()->start() 底层代码就是 native start0&#xff08;&#xff09;&…

SuccBI+低代码文档中心 — 分析报表

报表设计器界面介绍 报表设计器是用来设计报表的可视化工具&#xff0c;使用类Excel的、基于单元格的、所见即所得的方式设计报表&#xff0c;报表设计器界面如下图&#xff1a; 报表设计器主要包括如下功能板块&#xff1a; 数据源&#xff1a;数据源区域列出了可以用于报表…

haproxy高级功能配置

介绍HAProxy高级配置及实用案例 一.基于cookie会话保持 cookie value:为当前server指定cookie值&#xff0c;实现基于cookie的会话黏性&#xff0c;相对于基于 source 地址hash 调度算法对客户端的粒度更精准&#xff0c;但同时也加大了haproxy负载&#xff0c;目前此模式使用…

OpenGL ES->工作机制

渲染流程 渲染目的&#xff1a;输入3D立体坐标&#xff0c;输出绘制后的2D平面像素工作流程&#xff1a;顶点着色器->图元装配->几何着色器->光栅化->片段着色器->测试与混合&#xff0c;整个工作流程被封装在GPU内部&#xff0c;无法改变。运行在CPU的代码调用…