标准IO

news2024/11/24 12:50:38

fprintf和fscanf

fprintf

int printf(const char *format, ...);

把数据输出到终端

int fprintf(FILE *stream, const char *format, ...);

功能:

将format字符串中的内容,输出到stream文件流指针指向的文件中去,想要将数据以何种形式输出到文件中,只需在format中选择合适的占位符即可。

int sprintf(char *str, const char *format, ...);

功能:

将format字符串中的内容,输出到str所指向的字符数组中。(把任意类型的数据转换为字符串类型数据)

fscanf

int scanf(const char *format, ...);

从终端读取数据,把数据写入到format中格式占位符代表的变量的地址上

int fscanf(FILE *stream, const char *format, ...);

功能:

从stream文件流指针的指向的文件中读取匹配数量的数据(根据文件中数据的类型以及格式占位符的类型进行匹配),遇到不匹配的数据则不吸收,然后将吸收到的数据写入format中格式占位符所代表的地址上去。*%c可以吸收任意数据包括空格,回车等

返回值:成功吸收数据返回成功吸收的数据的项数(其实就是指格式占位符的数量)

*fscanf是格式化读取文件的函数,需要精准的把控文件中的数据是什么格式,然后使用对应的格式去读取,除非用%c一个字节一个字节的读取。

int sscanf(const char *str, const char *format, ...);

功能:

从str所指向的字符串或字符串数组中读取数据,写入format所代表的地址上。(将字符串类型转换成任意类型的数据)

练习

typedef struct student
{
  char name[20];
  int c;
  int m;
  int e;
  int p;
  int ch;
  int b;
}stu;
stu str[3]={};
编写两个.c文件:save.c和load.c
save.c负责使用fprintf把三个学生的数据保存到文件中
load.c负责读取文件中的学生信息,将读取到的数据,存到数组中,并输出数组中的内容

fputs和fgets

fputs

int fputs(const char *s, FILE *stream);

调用形式

fputs(想要写入文件中的字符串,文件流指针);

功能:

把字符串写入文件留指针所指向的文件中去

s:想要写入的字符串或字符数组

stream:文件流指针

返回值:写入失败返回EOF,成功返回非0数(大概率是写入的字符数量)

fgets(可吸收空格)

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

调用形式

char* a=fgets(用来存放吸收数据的字符数组,最多从终端吸收的数据的个数,文件流指针)

功能描述:

从文件流指针指向文件中,吸收最多size-1个字符,并将吸收到的数据存放到s指向的数组,在读取到EOF或‘\n’时,读取也会结束(读取到的EOF或‘\n’也会写入数组)

返回值:

成功读取返回第一个参数s,读取失败或者读取到文件结束的时候,返回NULL(判断是否读取到文件结束符的依据)

fgets读取结束的情况有三种

  1. 获取的数据达到size-1(最大读取上限)
  2. 读取到回车
  3. 读取到EOF

练习

使用fgets和fputs实现文件的拷贝

fwrite和fread

fwrite和fread使用数据流读写,之前的所有读写函数采用文件流读写

当读写对象为字符串或字符时,二进制数据为本身,其他数据的二进制数据位乱码

文件流:

所有类型的数据都会转换为字符串类型,再保存到文件中

数据流:

任意的数据都会以数据本身的二进制形式保存到文件中去

fwrite和fread一定要配合使用

fwrite

size_t fwrite(const void *ptr, size_t size, size_t nmemb,FILE *stream);

调用形式

fwrite(想要写入的数据的地址,单个数据的大小,多少个数据,文件流指针);

功能描述:

将ptr指向的内存上面, 总共nmemb项数据,每一项数据size大小,总共nmemb*size个字节的数据,写入 stream指向的文件中去,注意是以数据流的形式去写的

参数 ptr:指向想要写入文件中的数据

参数 size:每一个数据的大小

参数 nmemb:总共多少个数据

参数 stream;文件流指针

size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);

调用形式:

int a=fread(存放读取到的数据的地址,读取到的单个数据的大小,读取数据个数,文件流指针);

功能:

读取文件流指针所指向的文件中nmemb个数据,每个数据大小为size,总共读取nmemb*size个字节的数据,然后将读取到的数据写入ptr指向的内存中

参数 ptr:指向用来存放读取到的数据的指针

参数 size:每一个读取到的数据的大小

参数 nmemb:读取多少个数据

参数 stream:文件流指针

返回值:成功读取,返回读取到的数据的项数,也就是第三个参数,读取失败或者读取到文件末尾则返回0。

练习

使用fwrite和fread实现文件的拷贝

fseek文件流指针偏移函数

实现文件的光标定位问题

int fseek(FILE *stream, long offset, int whence);

调用形式

fseek(fp,1,SEEK_SET)

fseek(fp,-1,SEEK_END)

fseek(fp,5,SEEK_CUR)

功能:

定位文件流指针对应的文件的光标,从whence出开始偏移,偏移offset个字节

参数whence:光标偏移的起点

参数offset:光标偏移量,+表示从左往右,-表示从右往左

SEEK_SET:从文件开头位置开始偏移

SEEK_CUR:从文件当前光标位置开始偏移

SEEK_END:从文件结束符开始偏移

读取bmp文件的信息

练习

把bmp文件转换为全红

练习

 

寻找一个bmp图片,输出这张bmp图片的第一个像素点和最后一个像素点的bgr的值

#include <stdio.h>
#include <string.h>
#include <stdlib.h>	
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <pthread.h>
#include <semaphore.h>
#include <wait.h>
#include <signal.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <semaphore.h>
#include <sys/msg.h>
#include <sys/shm.h>
#include <sys/un.h>

typedef struct sockaddr_in addr_in_t;
typedef struct sockaddr addr_t;
typedef struct sockaddr_un addr_un_t;
int main(int argc, const char *argv[])
{
	FILE* fp=fopen("./rising_freedom (copy).bmp","r");
	int size=0,w=0,h=0;
	fseek(fp,2,SEEK_SET);
	fread(&size,4,1,fp);
	printf("%d\n",size);	

	fseek(fp,18,SEEK_SET);
	fread(&w,4,1,fp);
	fread(&h,4,1,fp);
	printf("%d %d\n",w,h);

	unsigned char bgr[3]={0};
	fseek(fp,54,SEEK_SET);

	for(int i=0;i<h;i++)
	{
		for(int j=0;j<w;j++)
		{
			if(i==0&&j==0)
			{
				fread(bgr,3,1,fp);
				for(int q=0;q<3;q++)
				{
					printf("%d ",bgr[q]);
				}
				putchar(10);
				continue;
			}	
			if(i==h-1&&j==w-1)
			{
				fread(bgr,3,1,fp);
				for(int q=0;q<3;q++)
				{
					printf("%d ",bgr[q]);
				}
				putchar(10);
			}
		}
	}
	fclose(fp);


	return 0;
}

修改一张bmp图像的大小,让它的宽度*2,高度*2,也就是最终像素点的数量*4,最后使用黑色像素点填充图片扩大部分(补要求效果,只要求代码)

#include <stdio.h>
#include <string.h>
#include <stdlib.h>	
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <pthread.h>
#include <semaphore.h>
#include <wait.h>
#include <signal.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <semaphore.h>
#include <sys/msg.h>
#include <sys/shm.h>
#include <sys/un.h>

typedef struct sockaddr_in addr_in_t;
typedef struct sockaddr addr_t;
typedef struct sockaddr_un addr_un_t;
int main(int argc, const char *argv[])
{
	FILE* fp=fopen("./rising_freedom (3rd copy).bmp","r");
	int size=0,w=0,h=0;
	fseek(fp,2,SEEK_SET);
	fread(&size,4,1,fp);
	printf("%d\n",size);	

	fseek(fp,18,SEEK_SET);
	fread(&w,4,1,fp);
	fread(&h,4,1,fp);
	printf("%d %d\n",w,h);		

	fclose(fp);
	fp=fopen("./rising_freedom (3rd copy).bmp","r+");		
	w*=2;
	h*=2;
	fseek(fp,18,SEEK_SET);
	fwrite(&w,4,1,fp);
	fwrite(&h,4,1,fp);
	fseek(fp,18,SEEK_SET);
	fread(&w,4,1,fp);
	fread(&h,4,1,fp);
	printf("%d %d\n",w,h);		

	size*=4;
	fseek(fp,2,SEEK_SET);
	fwrite(&size,4,1,fp);
	fseek(fp,2,SEEK_SET);
	fread(&size,4,1,fp);
	printf("%d\n",size);	

	unsigned char bgr_black[3]={0,0,0};
	unsigned char bgr[3]={};
	int len=(w/2)*(h/2)*3;
	fseek(fp,54,SEEK_SET);
	fseek(fp,len,SEEK_CUR);
	while(1)
	{
		int i=fread(bgr,3,1,fp);
		if(0==i)
			break;
		fwrite(bgr_black,3,1,fp);
	}


	fclose(fp);
	return 0;
}

将一张bmp图片修改为德国国旗

#include <stdio.h>
#include <string.h>
#include <stdlib.h>	
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <pthread.h>
#include <semaphore.h>
#include <wait.h>
#include <signal.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <semaphore.h>
#include <sys/msg.h>
#include <sys/shm.h>
#include <sys/un.h>

typedef struct sockaddr_in addr_in_t;
typedef struct sockaddr addr_t;
typedef struct sockaddr_un addr_un_t;
int main(int argc, const char *argv[])
{
	FILE* fp=fopen("./rising_freedom (copy).bmp","r");
	int size=0,w=0,h=0;
	fseek(fp,2,SEEK_SET);
	fread(&size,4,1,fp);
	printf("%d\n",size);	

	fseek(fp,18,SEEK_SET);
	fread(&w,4,1,fp);
	fread(&h,4,1,fp);
	printf("%d %d\n",w,h);

	fclose(fp);
	fp=fopen("./rising_freedom (copy).bmp","r+");

	unsigned char bgr_black[3]={0,0,0};
	unsigned char bgr_red[3]={0,0,255};
	unsigned char bgr_yellow[3]={0,255,255};
	fseek(fp,54,SEEK_SET);

	for(int i=0;i<h;i++)
	{
		for(int j=0;j<w/3;j++)
		{
			fwrite(bgr_yellow,3,1,fp);
		}
	}		
	for(int i=0;i<h;i++)
	{
		for(int j=w/3;j<w*2/3;j++)
		{
			fwrite(bgr_red,3,1,fp);
		}
	}
	for(int i=0;i<h;i++)
	{
		for(int j=w*2%3;j<w;j++)
		{
			fwrite(bgr_black,3,1,fp);
		}
	}

	fclose(fp);


	return 0;
}

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

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

相关文章

基于XxlCrawler的Java执行JS渲染方式实战-以获取商飞C919飞行照片为例

目录 前言 一、抓取目标解析 1、原始网站介绍 2、列表页面结构解析 二、XxlCrawler的常规配置 1、PageVo对象的定义 2、定义XxlCrawler并启动 三、使用HtmlUnit来执行动态渲染 1、在pom.xml中加入htmlunit的引用 2、设置PageLoader加载器 3、执行抓取 四、总结 前言…

看,esp8266就是这么简单

材料准备 1.esp 8266 2.一条可以传输数据的数据线 3一台电脑 前言 如今是物联网的时代&#xff0c;例如“智能家居&#xff0c;无人驾驶……”&#xff0c;多方面的进行物联网改革与创新。那其中&#xff0c;物联网主要的是联网。那通常都是以“esp 8266”和“esp 32”占据了…

在Kylin服务器安装PostgreSQL16数据库

1、下载PostgreSQL16安装包 下载地址https://www.postgresql.org/ftp/source/v16.3/ 2、安装依赖和ICU库 查看服务器版本 yum install -y perl-ExtUtils-Embed readline-devel zlib-devel pam-devel libxml2-devel libxslt-devel openldap-devel python-devel gcc-c opens…

在抖音做电商推广,货架场非做不可

前一段时间跟几个做电商的朋友聊天&#xff0c;我发现大家的干劲儿还挺满的&#xff0c;讨论的话题也出奇地一致&#xff1a;要找新增量。 其中有个朋友是做服装品类的&#xff0c;做得还不错。我请教他秘诀&#xff0c;他说&#xff1a;做电商&#xff0c;推广拿量非常关键。…

MySQL笔记(七):索引

一、索引优化速度 创建对应字段的索引&#xff0c;只对该列有效&#xff0c;只能提高该列的查询速度 创建索引后&#xff0c;查询速度变快&#xff0c;但是表占用空间变大 create index 索引名 on 表名(需要创建索引的列)二、索引的原理 普通索引允许该字段重复 全文索引&#…

Resize Observer监测DOM元素尺寸改变的神器

前言 大家在遇到需要监测DOM元素尺寸大小的需求时&#xff0c;可能第一时间想到的都是使用window.addEventListener来监听resize 事件&#xff0c; 但是reize事件会在一秒内触发将近60次&#xff0c;所以很容易在改变窗口大小时导致性能问题。因为它会监听我们页面每个元素的…

MySQL总体功能

基于Innodb存储引擎的讨论 MySQL 核心功能 功能解决的问题ACID模型数据并发访问&#xff0c;和奔溃恢复安全问题,一致性&奔溃恢复索引数据查询效率问题备份容错设计,解决硬件错误带来的问题复制数据迁移监控执行数据库操作的异常记录

《嵌入式 - 嵌入式大杂烩》ARM Cortex-M寄存器详解

1 ARM Cortex-M寄存器概述 ARM Cortex-M提供了 16 个 32 位的通用寄存器(R0 - R15),如下图所示。前15个(R0 - R14)可以用作通用的数据存储,R15 是程序计数器 PC,用来保存将要执行的指令。除了通用寄存器,还有一些特殊功能寄存器。特殊功能寄存器有预定义的功能,而且必须通…

Java编码算法

编码 1.编码算法2.URL编码**URLEncoder类&#xff0c;主要进行编码****URLDecoder类&#xff0c;主要进行解码** 3.Base64编码Base64编码Base64的补充字符Base64的占位符Base64的应用 结论&#xff1a; 1.编码算法 什么是编码? ASCII码就是一种编码&#xff0c;字母A的编码是…

C语言典型例题28

《C程序设计教程&#xff08;第四版&#xff09;——谭浩强》 习题2.5 输入一个华氏温度&#xff0c;要求输出摄氏温度。公式为C5/9(F-32)&#xff0c;要求输出要有文字说明&#xff0c;取两位小数 数学知识&#xff1a; &#xff08;1&#xff09;华氏温度与摄氏温度&#x…

MySQL(六):mysql 约束

基本介绍&#xff1a;约束用于确保数据库的数据满足特定的商业规则&#xff0c;约束包括&#xff1a;not null、unique、primary key、foreign key 、check五种。 一、主键的使用&#xff08;primary key) 字段名 字段类型 primary key用于唯一的表示表行的数据&#xff0c;当…

SpringBoot基础 第二天

SpringBoot对静态资源的映射: (1) 要在src/main/resources文件夹下创建static和templates两个文件夹staitc存储静态资源,templates存储模板引擎 (2)要在pom.xml依赖下导入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>…

VS项目打包成lib库并使用

一、新建一个静态库项目 一般要把项目设为Release模式 二、添加文件 将所需要打包的头文件、源文件添加到该静态库项目中 三、生成项目 生成成功后即可在Release文件夹出现找到相应的.lib文件 四、使用静态库 将静态库文件复制到项目文件夹中&#xff0c;然后在项目属性设…

LSV实验——部署DR模式集群

目录 一、实验环境 二、配置 1、LVS 2、router 3、client 4、RS 三、配置策略 1.Director服务器采用双IP桥接网络&#xff0c;一个是VPP&#xff0c;一个DIP 2.Web服务器采用和DIP相同的网段和Director连接 3.每个Web服务器配置VIP 4.每个web服务器可以出外网 一、实验环…

CENTOS9+RSYSLOG+LOGROTATE收集日志

系统版版本为CentOS Stream release 9 rsyslog和lograte通常系统已经安装了。 #rpm -qa | grep rsyslog rsyslog-logrotate-8.2310.0-4.el9.x86_64 rsyslog-8.2310.0-4.el9.x86_64 rsyslog-gnutls-8.2310.0-4.el9.x86_64 rsyslog-gssapi-8.2310.0-4.el9.x86_64 rsyslog-relp-…

常见中间件漏洞(三、Jboss合集)

目录 三、Jboss Jboss介绍 3.1 CVE-2015-7501 漏洞介绍 影响范围 环境搭建 漏洞复现 3.2 CVE-2017-7504 漏洞介绍 影响范围 环境搭建 漏洞复现 3.3 CVE-2017-12149 漏洞简述 漏洞范围 漏洞复现 3.4 Administration Console弱囗令 漏洞描述 影响版本 环境搭建…

Netty技术全解析:ByteToMessageCodec类深度解析

❃博主首页 &#xff1a; 「码到三十五」 &#xff0c;同名公众号 :「码到三十五」&#xff0c;wx号 : 「liwu0213」 ☠博主专栏 &#xff1a; <mysql高手> <elasticsearch高手> <源码解读> <java核心> <面试攻关> ♝博主的话 &#xff1a…

Qt/C++最新地图组件发布/历时半年重构/同时支持各种地图内核/包括百度高德腾讯天地图

一、前言说明 最近花了半年时间&#xff0c;专门重构了整个地图组件&#xff0c;之前写的比较粗糙&#xff0c;有点为了完成功能而做的&#xff0c;没有考虑太多拓展性和易用性。这套地图自检这几年大量的实际项目和用户使用下来&#xff0c;反馈了不少很好的建议和意见&#…

【技巧】IDEA 个性化配置

【技巧】IDEA 个性化配置 自动补全 关闭大小写区分 自动导包 插件 Rainbow Brackets 彩色括号 更容易区分是哪个括号

【LVS】负载均衡之NAT模式

一、LVS概念 LVS&#xff08;Linux Virtual Server&#xff09;是一个基于Linux操作系统的虚拟服务器技术&#xff0c;用于实现负载均衡和高可用性。LVS通过将客户端的请求分发到多台后端服务器上&#xff0c;从而提高整体服务的处理能力和可靠性。 二、LVS优势 高性能&…