C语言第三十六弹---文件操作(中)

个人主页: 熬夜学编程的小林

💗系列专栏: 【C语言详解】 【数据结构详解】

文件操作

1、文件的顺序读写

1.1、顺序读写函数介绍

1.1.1、fgetc 与 fputc

1.1.2、fgets 与 fputs

1.1.3、fscanf 与 fprintf

1.1.4、fread 与 fwrite

1.2、对比一组函数

总结


1、文件的顺序读写

1.1、顺序读写函数介绍

函数名功能适用于
fgetc字符输入函数所有输入流
fputc字符输出函数所有输出流
fgets文本行输入函数所有输入流
fputs文本行输出函数所有输出流
fscanf格式化输入函数所有输入流
fprintf格式化输出函数所有输出流
fread二进制输入文件
fwrite二进制输出文件

上面说的适用于所有输入流⼀般指适用于标准输入流和其他输入流(如文件输入流)所有输出流⼀般指适用于标准输出流和其他输出流(如文件输出流)

1.1.1、fgetc 与 fputc

int fputc ( int character, FILE * stream );

将字符写入流。
将字符写入流并推进位置指示器。

字符被写在流的内部位置指示器指示的位置,然后自动前进一个。

举个例子:

#include <stdio.h>
int main()
{
	//打开文件
	FILE* pf = fopen("test.txt", "w");
	//文件操作
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	//将字符写入文件
	fputc('a', pf);
	fputc('b', pf);
	fputc('c', pf);
	fputc('d', pf);
	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

VS执行此代码之后不会输出内容,需要去找到对应文件验证。 

int fgetc ( FILE * stream );

从流中获取字符。
返回指定流的内部文件位置指示器当前指向的字符。然后,内部文件位置指示器将前进到下一个字符。

如果流在调用时位于文件末尾,则该函数将返回 EOF 并设置流的文件末尾指示符 (feof)。

如果发生读取错误,该函数将返回 EOF 并设置流的错误指示器 (ferror)。

fgetc 和 getc 是等效的,只是 getc 在某些库中可以作为宏实现。

举个例子:

#include <stdio.h>
int main()
{
	//打开文件
	FILE* pf = fopen("test.txt", "r");
	//文件操作
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
    //从pf流中读取数据
	int ch = fgetc(pf);
	printf("%c ", ch);

	ch = fgetc(pf);
	printf("%c ", ch);

	ch = fgetc(pf);
	printf("%c ", ch);

	ch = fgetc(pf);
	printf("%c ", ch);
	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

输出结果与对应文件内容比较如下图:

1.1.2、fgets 与 fputs

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

将字符串写入流。
将 str 指向的 C 字符串写入流。

该函数从指定的地址 (str) 开始复制,直到到达终止 null 字符 ('0')。此终止 null 字符不会复制到流中。

请注意,fputs 与 puts 的不同之处不仅在于可以指定目标流,而且 fputs 不会写入其他字符,而 puts 会自动在末尾附加换行符。

举个例子:

#include <stdio.h>
int main()
{
	//打开文件
	FILE* pf = fopen("test1.txt", "w");
	//文件操作
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	//将字符串写入文件
	fputs("abcdef", pf);
	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

执行该代码之后的文件结果如下图: 

char * fgets ( char * str, int num, FILE * stream );
//str为接受数据的地址

从流中获取字符串。
从流中读取字符,并将它们作为 C 字符串存储到 str 中,直到读取 (num-1) 个字符或到达换行符或文件末尾,以先到者为准。

换行符使 fgets 停止读取,但它被函数视为有效字符,并包含在复制到 str 的字符串中。

终止 null 字符会自动追加到复制到 str 的字符之后。

请注意,fgets 与 gets 有很大不同:fgets 不仅接受 stream 参数,还允许指定 str 的最大大小,并在字符串中包含任何结束换行符。

#include <stdio.h>
int main()
{
	//打开文件
	FILE* pf = fopen("test1.txt", "r");
	//文件操作
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	char arr[100] = { 0 };
	//将文件中读取字符串
	fgets(arr, 5, pf);
	printf("%s\n", arr);
	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

测试结果如下图: 

1.1.3、fscanf 与 fprintf

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

将格式化的数据写入流。
将按格式指向的 C 字符串写入流。如果 format 包含格式说明符(以 % 开头的子序列),则格式后面的附加参数将被格式化并插入到生成的字符串中,以替换它们各自的说明符。

在 format 参数之后,该函数至少需要与 format 指定的其他参数一样多的附加参数。

举个例子:

#include <stdio.h>
struct S
{
	float f;
	char c;
	int n;
};
int main()
{
	struct S s = { 5.2f,'c',52 };//结构体初始化
	//打开文件
	FILE* pf = fopen("test1.txt", "w");
	//文件操作
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	//写文件
	fprintf(pf, "%f-%c-%d", s.f, s.c, s.n);
	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

代码测试:

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

从流中读取格式化的数据。
从流中读取数据,并根据参数格式将数据存储到其他参数所指向的位置。

附加参数应指向已分配的对象,该对象由格式字符串中的相应格式说明符指定。

举个例子:

#include <stdio.h>
struct S
{
	float f;
	char c;
	int n;
};
int main()
{
	struct S s = { 0 };
	//打开文件
	FILE* pf = fopen("test1.txt", "r");
	//文件操作
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	//读文件
	fscanf(pf, "%f-%c-%d", &(s.f), &(s.c), &(s.n));
	printf("%f-%c-%d\n", s.f, s.c, s.n);
	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

测试代码: 

1.1.4、fread 与 fwrite

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

将数据块写入流中。
从 ptr 指向的内存块写入一个 count 元素数组,每个元素的大小为 Bytes 字节。

流的位置指示器按写入的总字节数前进。

在内部,该函数将 ptr 指向的块解释为无符号字符类型的 (size*count) 元素数组,并按顺序将它们写入流式处理,就好像为每个字节调用了 fputc 一样。

举个例子:

#include <stdio.h>
int main()
{
	int arr[] = { 0,1,2,3,4,5,6,7,8,9 };
	//打开文件
	FILE* pf = fopen("data.txt", "wb");
	//文件操作
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
    //二进制写文件
	fwrite(arr, sizeof(arr[0]), sizeof(arr) / sizeof(arr[0]), pf);
	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

测试代码: 

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

从流中读取数据块。
从流中读取 count 元素的数组,每个元素的大小为 bytes,并将它们存储在 ptr 指定的内存块中。

流的位置指示器按读取的总字节数前进。

如果成功,读取的总字节数为 (size*count)。

举个例子:

#include <stdio.h>
int main()
{
	int arr[10] = { 0 };
	//打开文件
	FILE* pf = fopen("data.txt", "rb");
	//文件操作
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	//二进制写文件
	fread(arr, sizeof(arr[0]), sizeof(arr) / sizeof(arr[0]), pf);
	for (int i = 0; i < 10; i++)
	{
		printf("%d ", arr[i]);
	}
	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

测试代码: 

1.2、对比一组函数


scanf / fscanf / sscanf

                int scanf ( const char * format, ... );
//使用键盘输入信息
int fscanf ( FILE * stream, const char * format, ... );
//将stream中的信息写入后面格式化函数中
int sscanf ( const char* s, const char * format, ... );
//将字符串信息转化为格式化信息


printf / fprintf / sprintf

                int printf ( const char * format, ... );
//打印信息到屏幕
int fprintf ( FILE * stream, const char * format, ... );
//将后面格式化信息写到stream中
int sprintf ( char * str,    const char * format, ... );
//将格式化数据转化为字符串数据

总结


本篇博客就结束啦,谢谢大家的观看,如果公主少年们有好的建议可以留言喔,谢谢大家啦!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于状态机的按键消抖实现

摸鱼记录 Day_14 !(^O^)y review 在day_13中以按键状态判断为例学习了状态分析基于状态机的按键消抖原理-CSDN博客 分析得到了下图&#xff1a; 今日任务&#xff1a;完成此过程 !(^O^)y 小梅哥对应视频&#xff1a; 15B 基于状态机的按键消抖Verilog实现_哔哩哔哩…

《乱弹篇(23)读书摘录》

之前逾月&#xff0c;偷得闲遐&#xff0c;在腾迅视频看了两部以宋朝历史为背景的电视剧《后宫》和《清平乐》&#xff0c;觉得好看并觉得有所裨益&#xff0c;但之后就再也难以找到能让人有耐心去看完的一部电视剧了。在一阵儿唏嘘感叹后&#xff0c;便去读书网搜索小说书读&a…

砝码称重 蓝桥杯

在C中&#xff0c;fabs()和abs()都用于计算数字的绝对值&#xff0c;但它们之间有一些区别。 fabs(double x)&#xff1a;计算浮点数x的绝对值&#xff0c;返回一个double类型的结果。 abs(int x)&#xff1a;计算整数x的绝对值&#xff0c;返回一个int类型的结果。 数组的默…

PolarDB for PostgreSQL-概述

阿里云数据库的概述 本篇罗列了一些知识点和结构。 日志 2. 同步复制&#xff1a;下降20% 异步复制&#xff1a;数据丢失风险&#xff0c; 部署 1.示例&#xff1a; vim polarx.toml 1.测试主库和备库数据一致性 备库是否一致性读 一个节点荡掉&#xff0c;提供服务。 GMS CN…

HCIP —— BGP --- 路由反射器和联邦

目录 IBGP的水平分割 解决办法 路由反射器 --- RR 反射器的环路问题如何解决&#xff1f;&#xff1f;&#xff1f; 1.Originator_ID 起源者ID 2.Cluster_List --- 簇列表 RR的配置 联邦的配置 1.联邦和其他AS设备建EBGP对等体 2.联邦内部IBGP建立对等体 3.联邦内部E…

数据管理【总结】

大数据&#xff1a;是指极其庞大的数据集&#xff0c;通常具备五大特征&#xff08;5个V&#xff09;&#xff1a;数据量大&#xff08;Volume&#xff09;、数据类型多样&#xff08;Variety&#xff09;、数据生成速度快&#xff08;Velocity&#xff09;、数据真实性高&…

最新Claude3注册教程:解决Claude3 Opus被封无法发送手机验证码问题

Claude3注册指南&#xff1a;解决无法发送手机验证码问题 Anthropic在3月4日宣布推出最新的大型语言模型&#xff08;LLM&#xff09;系列——Claude 3。这一系列模型在多种认知任务上树立了新的性能标准&#xff0c;包括Claude 3 Haiku、Claude 3 Sonnet 和 Claude 3 Opus三个…

2024年纯前端VUE在线编辑微软Office/金山WPS的Word文档,支持私有化部署!

现在&#xff0c;随着数字化进程渗透到到各行各业&#xff0c;数据安全已经成为了数字化革命中的重要组成部分&#xff0c;而在线Office成在OA、ERP、文档系统中得到了广泛的应用&#xff0c;为我国的信息化事业也做出了巨大贡献。随着操作系统、浏览器及Office软件的不断升级和…

node的安装与介绍

安装 下载地址 node官网首页就会有两个安装选择&#xff0c;会根据当前电脑的系统自动显示对应的安装包&#xff0c;一个长期维护版&#xff08;LTS&#xff09;,一个是尝鲜版&#xff0c;记住选择LTS版本 安装指定版本下载截图 安装过程截图&#xff08;非常简单&#xff…

短剧小程序:掌中剧院,随时演绎精彩

在快节奏的现代生活中&#xff0c;人们越来越追求高效与便捷。为了满足广大用户对短剧内容的热爱和追求&#xff0c;我们推出了全新的短剧小程序&#xff0c;让精彩剧情触手可及&#xff0c;随时随地为您带来欢乐与感动。 一、轻松点播&#xff0c;随享短剧魅力 通过短剧小程…

Talk|加州大学圣地亚哥分校程旭欣:视觉反馈下足式机器人的全身操作与运动

本期为TechBeat人工智能社区第576期线上Talk。 北京时间3月6日(周三)20:00&#xff0c;加州大学圣地亚哥分校博士生—程旭欣的Talk已准时在TechBeat人工智能社区开播&#xff01; 他与大家分享的主题是: “视觉反馈下足式机器人的全身操作与运动”&#xff0c;向大家系统地介绍…

【开源】JAVA+Vue.js实现大学生相亲网站

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块三、系统展示四、核心代码4.1 查询会员4.2 查询相亲大会4.3 新增留言4.4 查询新闻4.5 新增新闻 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVueSpringBootMySQL的大学生相亲网站&#xff0c;包含了会员管理模块、新闻管…

Vue开发实例(十)Tabs标签页打开、关闭与路由之间的关系

创建标签页 一、创建标签页二、点击菜单展示新标签页1、将标签数据作为全局使用2、菜单点击增加标签页3、处理重复标签4、关闭标签页 三、点击标签页操作问题1&#xff1a;点击标签页选中菜单进行高亮展示问题2&#xff1a;点击标签页路由也要跳转 四、解决bug 先展示最终效果 …

项目管理工具进度猫:自我管理的应用

在飞速发展的现代社会中&#xff0c;每个人都面临着巨大的竞争压力&#xff0c;如何在这激烈的环境中脱颖而出&#xff0c;实现个人的成长与成功&#xff1f;答案就在我们的日常行为中——自我管理。 一、自我管理的定义 自我管理&#xff0c;简单来说&#xff0c;就是对自己…

mysql8安装配置(最新版)

目录 一、下载mysql8 二、安装mysql8 三、配置mysql 一、下载mysql8 下载链接&#xff1a;https://pan.quark.cn/s/58d9072e51c4 二、安装mysql8 双击msi文件 选择custom 根据所需选择组件 修改安装路径 选中execute&#xff0c;安装&#xff0c;弹出提示安装VS的提示框之后…

LT6813/ADBMS1818底层驱动---均衡控制

1、LT6813采用内部均衡的原理 2、平衡控制结构体 根据数据库中读取的控制值设置平衡。要为单元设置平衡&#xff0c;必须将相应的位写入配置寄存器中。LTC 驱动程序仅执行数据库中 BMS 写入的数据。 参数 ltc_stateLTC 状态机的状态pSpi接口指向 SPI 配置的指针pTxBuff &…

Android SDK2 (实操三个小目标)

书接上回&#xff1a;Android SDK 1&#xff08;概览&#xff09;-CSDN博客 今天讲讲三个实际练手内容&#xff0c;用的是瑞星微的sdk。 1 实操编译Android.bp 首先还是感叹下&#xff0c;现在的系统真的越搞越复杂&#xff0c;最早只有gcc&#xff0c;后面多了make&#xf…

2.3_9 读者-写者问题

2.3_9 读者-写者问题 &#xff08;一&#xff09;问题描述 有读者和写者两组并发进程&#xff0c;共享一个文件&#xff0c;当两个或两个以上的读进程同时访问共享数据时不会产生副作用&#xff0c;但若某个写进程和其他进程&#xff08;读进程或写进程&#xff09;同时访问共…

【nvm】nvm的安装和使用

简言 nvm(nvm-windows)的安装和使用。 nvm 允许你通过命令行快速安装和使用不同版本的 node。 nvm 适用于任何符合 POSIX 标准的 shell&#xff08;sh、dash、ksh、zsh、bash&#xff09;&#xff0c;尤其适用于以下平台&#xff1a;Unix、macOS 和 windows WSL。 不过 nvm 在…

安全防御第七次作业

拓扑图如图所示&#xff1a; 问题&#xff1a;在FW7和FW8之间建立一条IPSEC通道保证10.0.2.0/24网段 可以正常访问到192.168.1.0/24 注&#xff1a;基础配置我在此省略了 一、NAT配置 FW4&#xff1a; FW6&#xff1a; 二、在FW4上做服务器映射 三、配置IPSEC FW5&#xff…