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

news2024/9/20 14:48:01

文章目录

    • 三种读写函数
      • 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.coloradmin.cn/o/1995651.html

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

相关文章

Flink Checkpoint expired before completing解决方法

在Flink消费Kafka日志的时候出现了这样的一则报错&#xff0c; JobManager报错如下&#xff1a; 2024-03-07 15:21:12,500 [Checkpoint Timer] WARN org.apache.flink.runtime.checkpoint.CheckpointFailureManager [] - Failed to trigger or complete checkpoint 181 for …

面试官:怎样设计一个分布式任务调度平台?

大家好&#xff0c;我是君哥。 在工作中&#xff0c;批量任务调度的需求经常会遇到&#xff0c;比如下面的几个场景&#xff1a; 数据迁移&#xff1a;从数据库 A 批量读取数据&#xff0c;加工后把数据写入数据库 B&#xff1b; 消息通知&#xff1a;运营商批量给客户发送短…

宠物空气净化器什么牌子好?希喂、美的测评推荐

家里养了两只猫&#xff0c;每天晚上和我入眠&#xff0c;早上睡醒过来就看到猫睡在我身边&#xff0c;这一刻幸福感爆棚。幸福感爆棚的同时&#xff0c;无力感也袭来。主要是因为虽然每天玩得都很开心&#xff0c;但是家里的变化让我不禁感慨这是真实存在的吗。一回到家就会发…

【Material-UI】Checkbox组件:受控模式详解

文章目录 一、什么是受控组件&#xff1f;二、受控模式的基本用法1. 核心概念2. 代码分析 三、受控组件的优势与应用场景1. 确保数据的一致性2. 简化复杂的表单逻辑3. 轻松实现状态回显 四、受控模式的最佳实践1. 状态管理2. 优化性能3. 处理异步数据 五、结论 在Web开发中&…

【数据结构-前缀哈希】力扣3026. 最大好子数组和

给你一个长度为 n 的数组 nums 和一个 正 整数 k 。 如果 nums 的一个 子数组 中&#xff0c;第一个元素和最后一个元素 差的绝对值恰好 为 k &#xff0c;我们称这个子数组为 好 的。换句话说&#xff0c;如果子数组 nums[i…j] 满足 |nums[i] - nums[j]| k &#xff0c;那么…

如何通过AquilaInsight快速查看每天有哪些异常/慢查询?

友情链接&#xff1a; AquilaInsight核心功能及角色概览Aquila的核心功能介绍DBA Service的核心功能介绍刚部署好Aquila Insight&#xff0c;第一次如何使用如何通过Aquila Insight快速定位一个查询为什么慢&#xff1f;Aquila 添加自定义监控信息和告警的示例当Quark/Incepto…

[器械财讯]威高血液净化:中国血液透析市场的领军企业冲刺IPO

一、IPO冲刺&#xff1a;威高血净迎来新进展 山东威高血液净化制品股份有限公司&#xff08;以下简称“威高血净”&#xff09;在2023年12月30日正式启动IPO后&#xff0c;于2024年8月2日迎来新进展&#xff0c;其审核状态在上海证券交易所更新为“已问询”。尽管2024年医药行…

没有获取淘宝API的资质怎么获取淘宝数据

淘宝是头部电商平台之一&#xff0c;每个自研商家或电商软件服务商想要开发电商管理功能模板就少不了要对接淘宝API。淘宝API是在淘宝开放平台提供的&#xff0c;自研商家和软件服务商接入淘宝开放平台需要经过一系列审核和申请流程&#xff0c;要求资质和相关资料符合对应的要…

Windows下,C# 通过FastDDS高效通信

目录 1、安装FastDDS 库2、使用IDL定义自己的数据格式3、生成DLL3.1 托管 &#xff08;Managed&#xff09;模式3.2 非托管 &#xff08;Unmanaged&#xff09;模式 -- 可用于Unity 代码示例 eprosima Fast DDS is a C implementation of the DDS (Data Distribution Service) …

【面试八股文】软件测试面试题汇总

&#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 1、你的测试职业发展是什么? 测试经验越多&#xff0c;测试能力越高。所以我的职业发展是需要时间积累的&#xff0c;一步步向着高级测试工程师奔去。而且我也有…

bug: 配置flyway.locations多个脚本位置不生效

文章目录 业务场景场景一场景二 业务场景 随着项目版本迭代&#xff0c;数据库结构也会变动。如果一个项目引用其他项目的jar包&#xff0c;并且需要执行对应jar包的flyway脚本&#xff0c;就需要配置flyway.locations 场景一 正常情况下&#xff0c;在一个项目中可以在yml文件…

【亲测有效!】ubuntu20.04和Centos7离线安装docker及nvidia-container-toolkit

【亲测有效&#xff01;】ubuntu20.04和Centos7离线安装docker及nvidia-container-toolkit 一、Ubuntu20.04安装docker&#xff08;1&#xff09;查看当前系统版本号和名称&#xff08;2&#xff09;在镜像源进行源文件下载&#xff08;3&#xff09;命令行进行安装&#xff08…

Mindspore框架利用扩散模型DDPM生成高分辨率图像|(三)模型训练与推理实践

利用扩散模型DDPM生成高分辨率图像&#xff08;生成高保真图像项目实践&#xff09; Mindspore框架利用扩散模型DDPM生成高分辨率图像|&#xff08;一&#xff09;关于denoising diffusion probabilistic model &#xff08;DDPM&#xff09;模型 Mindspore框架利用扩散模型DD…

告别杂音,从 AI 音频降噪开始

生活中&#xff0c;音频无处不在。无论是聆听动人的音乐&#xff0c;还是参与重要的电话会议&#xff0c;又或是沉浸于精彩的网课学习&#xff0c;清晰、纯净的音频质量都至关重要。然而&#xff0c;音频中的噪声却像不速之客&#xff0c;扰乱着这份美好。 音频中的噪声形式多样…

封装一个给 .NET Framework 用的内存缓存帮助类

前言 .NET Core 中已经内置了内存缓存相关的类和操作方法&#xff0c;直接就能使用&#xff0c;非常方便。但在 .NET Framework 中&#xff0c;如果想要使用内存缓存&#xff0c;需要自己进行封装。本文分享一个我自己项目中封装的内存缓存帮助类&#xff0c;有需要的童鞋可以…

前端已经学会vue,做粒子效果

目录 1. Canvas API 2. WebGL 3. 粒子系统 4. 动画与性能优化 5. 现有库和框架 6. Vue 组件和状态管理 实践项目建议 案例1 案例2雪花 已经熟悉了 Vue、TypeScript 和 JavaScript&#xff0c;下面是一些你可以学习的内容&#xff0c;以帮助你实现粒子效果的界面&#…

深度学习基础 - 梯度垂直于等高线的切线

深度学习基础 - 梯度垂直于等高线的切线 flyfish 梯度 给定一个标量函数 f ( x , y ) f(x, y) f(x,y)&#xff0c;它的梯度&#xff08;gradient&#xff09;是一个向量&#xff0c;表示为 ∇ f ( x , y ) \nabla f(x, y) ∇f(x,y)&#xff0c;定义为&#xff1a; ∇ f ( x…

单片机GPIO模式和应用

Push pull 推挽输出 定义&#xff1a;推挽输出是一种输出模式&#xff0c;其中引脚可以输出高电平或低电平&#xff0c;且两种电平状态下都具有较强的驱动能力。 特点&#xff1a; 无论输出高电平还是低电平&#xff0c;都有较强的电流驱动能力。 适用于驱动外部数字电路…

宝塔面板启用 QUIC 与 Brotli 的完整教程

环境 系统&#xff1a;Ubuntu 22.04.4 LTS x86_64 宝塔版本&#xff1a;7.7.0 (可使用本博客提供的一键安装优化脚本) nginx版本&#xff1a;1.26.1 开放UDP端口 注意&#xff1a;在你的服务器商家那里也要开放443 udp端口 sudo ufw allow 443/udp然后重新加载 UFW 以使新…

【漏洞复现】maxView Storage Manager 远程代码执行漏洞

maxView Storage Manager使查看、监控和配置系统中基于Microsemi RAID适配器构建的所有存储变得简单。⽅便的图形⽤户界⾯&#xff08;GUI&#xff09;在Microsemi产品线和⽀持的操作系统&#xff08;包括 Windows、Linux、VMWare和Solaris&#xff09;中的外观和操作都相同。使…