C语言-有两个磁盘文件A和B,各存放一行字母,今要求把这两个文件的信息合并(按字母顺序排列),输出到一个新文件C中去-深度代码解析

news2024/9/20 22:58:14

1、题目要求

有两个磁盘文件A和B,各存放一行字母,今要求把这两个文件的信息合并(按字母顺序排列),输出到一个新文件C中去

2、准备工作

问题1:为什么不需要手动创建C.txt文件?

答:根据题意我们可知,我们需要调用fopen函数以只读方式打开A.txt和B.txt文件,只读方式打开文件要求文件必须提前存在,而C.txt文件需要以写入方式打开,如果文件不存在,会自动创建一个C.txt文件。

参考:fopen函数使用方法

3、具体程序

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
void openFile(FILE **fpa,FILE **fpb, FILE **fpc)  //打开文件函数
{
	*fpa = fopen("A.txt", "r");
	if (*fpa == NULL)
	{
		printf("打开文件A失败\n");
		exit(1);
	}
	*fpb = fopen("B.txt", "r"); 
	if (*fpb == NULL)
	{
		printf("打开文件B失败\n");
		exit(1);
	}
	*fpc = fopen("C.txt", "w");
	if (*fpc == NULL)
	{
		printf("打开文件c失败\n");
		exit(1);
	}
}
void closeFile(FILE* fpa, FILE* fpb, FILE* fpc)//关闭文件函数
{
	fclose(fpa);
	fclose(fpb);
	fclose(fpc);
}
void GetBufferChar(FILE* fpa, FILE* fpb, char* buffer)//连接字符串函数
{
	fgets(buffer, 1024, fpa);//从A文件读入数据
	int len = strlen(buffer);
	fgets(buffer + len, 1024, fpb);//从B文件读入数据
}
void SortBufferChar(char* buffer)
{
	int n = strlen(buffer);
	for (int i = 0; i < n - 1; i++)
	{
		for (int j = 0; j < n - i - 1; j++)
		{
			if (buffer[j] > buffer[j + 1])
			{
				char temp = buffer[j];
				buffer[j] = buffer[j + 1];
				buffer[j + 1] = temp;
			}
		}
	}
}
void SaveFile(FILE* fpc, char* buffer)
{
	fputs(buffer, fpc);
}
int main()
{
	FILE* fpa, *fpb, *fpc;
	char buffer[1024] = { 0 };
	openFile(&fpa, &fpb, &fpc);//打开全部文件,A,B以只读方式,C以写入方式

	GetBufferChar(fpa, fpb, buffer);//连接字符串

	printf("数据相连的结果是\n%s\n",buffer);

	SortBufferChar(buffer);//字符串排序
	printf("排序后字符串结果是\n%s\n",buffer);

	SaveFile(fpc, buffer);

	closeFile(fpa, fpb, fpc);
	
	return 0;
}

4、代码深度解析

4.1 main函数:

创建三个FILE类型指针,和字符型数组buffer,并通过5个函数实现功能;

4.2 openFile函数

openFile(FILE **fpa,FILE **fpb, FILE **fpc)

函数参数为二级指针,即FILE类型地址的地址(指针的指针)

问题2:为什么要拿二级指针而不是一级指针

答:在主函数中,我么创建了三个FILE类型的指针变量,但是并没有给定指向,那么最开始的三个FILE类型的指针变量需要我们在openFile函数中给定指向。具体是怎么做的呢?首先,我们知道实参向形参的数据传递是“值传递”,单向传递,如果将一级指针传给openFile函数,然后在openFile函数中将一级指针指向fopen函数即以下代码,那么根据值传递的特点,main函数中的File类型指针实际上根本没有指向fopen函数,这显然是错误的。那么如何让main函数中的FILE类型指针指向fopen函数呢?这就需要二级指针发挥作用了,我们将二级指针作为openFile函数参数,通过解引用的方式将二级指针的值(解引用二级指针,得到二级指针的值,即一级指针)指向fopen函数,这相当于在main函数中将三个FILE类型指针初始化了,这显然是可行的,因此要拿二级指针而不是一级指针。

参考:C语言实参和形参数据传递的特点及使用技巧

void openFile(FILE *fpa,FILE *fpb, FILE *fpc)  //打开文件函数(错误写法)
{
	fpa = fopen("A.txt", "r");
	if (fpa == NULL)
	{
		printf("打开文件A失败\n");
		exit(1);
	}
	fpb = fopen("B.txt", "r"); 
	if (fpb == NULL)
	{
		printf("打开文件B失败\n");
		exit(1);
	}
	fpc = fopen("C.txt", "w");
	if (fpc == NULL)
	{
		printf("打开文件c失败\n");
		exit(1);
	}
}
int main()
{
	FILE* fpa, *fpb, *fpc;

	openFile(fpa, fpb, fpc);//(错误写法)
	
	return 0;
}

4.3 closefile函数

closeFile(FILE* fpa, FILE* fpb, FILE* fpc)

此函数在文件操作完成后,将各文件关闭。

参考:fclose函数使用方法

4.4 GetBufferChar函数

GetBufferChar(FILE* fpa, FILE* fpb, char* buffer)

该函数为字符串连接函数,用于将A.txt和B.txt文件中的字符串连接并保存到字符数组中,在main函数中直接将字符数组buffer的数组名作为参数,则数组名为指向字符数组首元素的指针。通过fgets函数从文件流fpa中取出最多1024-1个字符赋值给buffer字符数组进行顺序保存(fgets函数功能),保存完文件A.txt中的字符后,计算buffer数组中的字符长度,以供B.txt文件中的字符紧跟在已经存入buffer字符数组中A文件字符的后面,实现两文件字符在buffer字符数组中实现连接。

参考:fgets函数的使用方法

问题3:什么是文件流?

答:文件流是一个抽象的概念,我们可以这样理解,FILE类型的指针通过fopen函数指向一个文件后,FILE类型的指针变量就能够称为文件流了,我们可以通过文件流实现各种文件操作。

4.5 SortBufferChar函数

SortBufferChar(char* buffer)

该函数实现将buffer数组中已经连接好的字符重新排序,采用的是冒泡排序

参考:字符串排序方法

4.6 SaveFile函数

SaveFile(FILE* fpc, char* buffer)

此函数将buffer中排好序的字符最终写入到文件C.txt中

参考:fputs函数使用方法

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

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

相关文章

技术分享-商城篇-订单模块-取消/收货功能(十六)

前言 再上一篇文章技术分享-商城篇-用户订单管理&#xff08;十五) 中&#xff0c;订单模块用户操作含有&#xff1a;取消订单、去支付、确认收货、删除订单、查看详情、去退款、查看物流、再次购买等业务操作&#xff0c;以上的每一个操作&#xff0c;都是对应不同的业务和状…

AudioNotes -将音频内容转 markdown

文章目录 一、关于 AudioNotes效果展示音视频识别和整理与音视频内容对话 二、使用方法1、安装 Ollama2、拉取模型3、部署服务3.1 Docker部署&#xff08;推荐&#xff09;&#x1f433;3.2 本地部署 &#x1f4e6; 一、关于 AudioNotes AudioNotes 能够快速提取音视频的内容&…

贪心处理任务(华为od机考题)

一、题目 1.原题 在某个项目中有多个任务&#xff08;用 tasks 数组表示&#xff09;需要您进行处理&#xff0c; 其中 tasks[i] [si, ei]&#xff0c; 你可以在 si < day < ei 中的任意一天处理该任务。 请返回你可以处理的最大任务数。 注&#xff1a;一天可以完成一…

硬件面试经典 100 题(81~90)题

81、请问下图电路中二极管 D1、D2 有什么作用&#xff1f; 在 Vi 输入电压接近于零时&#xff0c;D1、D2 给三极管 T1、T2 提供偏置电压&#xff0c;使 T1、T2 维持导通&#xff0c;以消除交越失真。 陈氏解释 这道题参见&#xff1a;硬件面试经典 100 题&#xff08;51~70 题…

【学习笔记】STM32F407探索者HAL库开发(三)IO分配

【学习笔记】STM32F407探索者HAL库开发&#xff08;三&#xff09;IO分配 1 STM32F407 IO资源分配表2 STM32F407ZGT6 引脚定义3 IO分配的重要性3.1 硬件设计优化3.2 软件编程3.3 系统性能提升 4 F1/F7/H7芯片的IO分配差异4.1 引脚数量和分组4.2 功能模式4.2.1 输入模式4.2.2 输…

Kubernetes 外部 etcd 集群的快速 Docker Compose 部署指南

一、背景 在高可用 Kubernetes 部署中&#xff0c;需要单独部署外部 etcd 集群&#xff0c;而不是使用 kubeadm 默认在 master 节点上部署的 etcd。以下是关于这一配置场景的详细记录。 二、etcd简介 etcd 是一个高可用的分布式键值存储系统&#xff0c;主要用于存储和管理配…

使用Qt+Visual Stuidio写一个简单的音乐播放器(1)

1.使用QMediaPlayer播放音乐 第三步:在代码头部加上: #include <QtMultimedia/QMediaPlayer> // VS向.pro文件添加代码的方式 #pragma execution_character_set("utf-8") // qt支持显示中文 QMediaPlayer类是一个高级媒体播放类。它可以用来播放歌曲、电…

leetcode 893. Groups of Special-Equivalent Strings

原题链接 You are given an array of strings of the same length words. In one move, you can swap any two even indexed characters or any two odd indexed characters of a string words[i]. Two strings words[i] and words[j] are special-equivalent if after any …

力扣: 设计链表

文章目录 需求代码结尾 需求 你可以选择使用单链表或者双链表&#xff0c;设计并实现自己的链表。 单链表中的节点应该具备两个属性&#xff1a;val 和 next 。val 是当前节点的值&#xff0c;next 是指向下一个节点的指针/引用。 如果是双向链表&#xff0c;则还需要属性 p…

Java 的数组详解

数组的定义 数组是相同类型数据的有序集合 数组描述的是相同类型的若干个数据&#xff0c;按照一定的先后次序排列组合而成 其中&#xff0c;每一个数据称作一个数组元素&#xff0c;每个数组元素可以通过一个下标(编号、标记)来访问它&#xff0c;下标是从 0 开始的&#xf…

100套动画PPT模版分享

100套动画PPT模板 目录下载链接 目录 下载链接 「动画模板」链接&#xff1a;https://pan.quark.cn/s/73ea2523f198 点击下载

中小型企业如何管理文档?8款工具来帮你

文章介绍了以下几个工具&#xff1a;PingCode、Worktile、氚云、泛微、中通天鸿、Tower、知因智慧、SharePoint。 在中小型互联网企业中&#xff0c;文档知识库的管理常常让人头疼。团队成员散布在不同的地点&#xff0c;文档分散在各种工具中&#xff0c;查找信息变得异常困难…

Linux启动流程和Systemd特性

文章目录 内核设计流派linux启动流程1.硬件加电自检2.启动加载器bootloader3.加载kernel4.init初始化5.用户终端启动 systemdsystemd特性systemd的unitunit配置文件 systemctl管理系统服务service unit服务状态 service unit文件格式Unit段Service段Install段 内核设计流派 1.…

资源第二篇:bundle 的config.json 文件内容的解析

简介 本篇文章主要是对bundle包的核心文件config.json 的分析。config.json记录着整个bundle包的具体信息&#xff0c;并通过config.json 去解析整个bundle包。 bundle 目录下的文件结构 import 存放所有的json。场景、预制体、texture2D配置等jsonnative 存放所有的实际资源…

分子属性梯度引导的3D分子生成扩散模型 TAGMOL - 评测

TAGMoL 是一个基于分子属性条件引导扩散的 3D 分子生成模型&#xff0c;适合在给定靶标蛋白质的情况下&#xff0c;可以生成一系列满足目标特性&#xff08;分子属性&#xff0c;binding affinity&#xff09;的候选分子。 一、背景介绍 TAGMoL 来源于新德里 Molecule AI, 以及…

ESP32 出现 failed to load RF 报错

前言 个人邮箱&#xff1a;zhangyixu02gmail.com 正文 周五我测试程序没有问题&#xff0c;板子放在桌子上就没动过了。周一过来的时候&#xff0c;重新烧录程序&#xff0c;就发现出现如下报错。最终发现是电池过放导致电池损坏功率不够&#xff0c;因此 RF 无法启动&#…

探寻少儿自闭症的解决之道

自闭症&#xff0c;又称孤独症谱系障碍&#xff0c;是一种广泛性发育障碍&#xff0c;给无数家庭带来了沉重的负担。然而&#xff0c;随着科学技术的不断进步和人们对自闭症认识的逐步深入&#xff0c;越来越多的方法和途径正在被探索出来&#xff0c;为自闭症的解决带来了希望…

RocketMQ 与 Spring Cloud Stream之事务消息配置

1 引言 RocketMQ的事务消息设计是为了解决分布式系统中数据一致性的问题。在分布式系统中&#xff0c;由于数据可能分布在不同的服务或节点上&#xff0c;因此需要一种机制来确保数据的最终一致性。事务消息通过引入本地事务和消息状态的关联&#xff0c;确保了消息的发送与本…

【什么是“Binary“二进制文件?】

“Binary”二进制文件是计算机文件的一种形式。部件文件是开发人员编写的源代码文件&#xff0c;还未被编译成可执行的机器代码&#xff0c;通常具有如.c、.cpp、.java 等扩展名。对象文件是部件文件经过编译器编译生成的中间文件&#xff0c;包含了部件文件的机器代码和符号表…

链表OJ题——环形链表2

文章目录 一、题目链接二、解题思路三、解题代码 一、题目链接 环形链表2 题目描述&#xff1a;在链表有环的基础上&#xff0c;找出环的入口点。 二、解题思路 三、解题代码