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

本文主要是介绍C语言-有两个磁盘文件A和B,各存放一行字母,今要求把这两个文件的信息合并(按字母顺序排列),输出到一个新文件C中去-深度代码解析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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函数使用方法

这篇关于C语言-有两个磁盘文件A和B,各存放一行字母,今要求把这两个文件的信息合并(按字母顺序排列),输出到一个新文件C中去-深度代码解析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1105755

相关文章

网页解析 lxml 库--实战

lxml库使用流程 lxml 是 Python 的第三方解析库,完全使用 Python 语言编写,它对 XPath表达式提供了良好的支 持,因此能够了高效地解析 HTML/XML 文档。本节讲解如何通过 lxml 库解析 HTML 文档。 pip install lxml lxm| 库提供了一个 etree 模块,该模块专门用来解析 HTML/XML 文档,下面来介绍一下 lxml 库

Hadoop集群数据均衡之磁盘间数据均衡

生产环境,由于硬盘空间不足,往往需要增加一块硬盘。刚加载的硬盘没有数据时,可以执行磁盘数据均衡命令。(Hadoop3.x新特性) plan后面带的节点的名字必须是已经存在的,并且是需要均衡的节点。 如果节点不存在,会报如下错误: 如果节点只有一个硬盘的话,不会创建均衡计划: (1)生成均衡计划 hdfs diskbalancer -plan hadoop102 (2)执行均衡计划 hd

hdu2241(二分+合并数组)

题意:判断是否存在a+b+c = x,a,b,c分别属于集合A,B,C 如果用暴力会超时,所以这里用到了数组合并,将b,c数组合并成d,d数组存的是b,c数组元素的和,然后对d数组进行二分就可以了 代码如下(附注释): #include<iostream>#include<algorithm>#include<cstring>#include<stack>#include<que

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

活用c4d官方开发文档查询代码

当你问AI助手比如豆包,如何用python禁止掉xpresso标签时候,它会提示到 这时候要用到两个东西。https://developers.maxon.net/论坛搜索和开发文档 比如这里我就在官方找到正确的id描述 然后我就把参数标签换过来

usaco 1.2 Name That Number(数字字母转化)

巧妙的利用code[b[0]-'A'] 将字符ABC...Z转换为数字 需要注意的是重新开一个数组 c [ ] 存储字符串 应人为的在末尾附上 ‘ \ 0 ’ 详见代码: /*ID: who jayLANG: C++TASK: namenum*/#include<stdio.h>#include<string.h>int main(){FILE *fin = fopen (

poj 1258 Agri-Net(最小生成树模板代码)

感觉用这题来当模板更适合。 题意就是给你邻接矩阵求最小生成树啦。~ prim代码:效率很高。172k...0ms。 #include<stdio.h>#include<algorithm>using namespace std;const int MaxN = 101;const int INF = 0x3f3f3f3f;int g[MaxN][MaxN];int n

科研绘图系列:R语言扩展物种堆积图(Extended Stacked Barplot)

介绍 R语言的扩展物种堆积图是一种数据可视化工具,它不仅展示了物种的堆积结果,还整合了不同样本分组之间的差异性分析结果。这种图形表示方法能够直观地比较不同物种在各个分组中的显著性差异,为研究者提供了一种有效的数据解读方式。 加载R包 knitr::opts_chunk$set(warning = F, message = F)library(tidyverse)library(phyl

透彻!驯服大型语言模型(LLMs)的五种方法,及具体方法选择思路

引言 随着时间的发展,大型语言模型不再停留在演示阶段而是逐步面向生产系统的应用,随着人们期望的不断增加,目标也发生了巨大的变化。在短短的几个月的时间里,人们对大模型的认识已经从对其zero-shot能力感到惊讶,转变为考虑改进模型质量、提高模型可用性。 「大语言模型(LLMs)其实就是利用高容量的模型架构(例如Transformer)对海量的、多种多样的数据分布进行建模得到,它包含了大量的先验

业务中14个需要进行A/B测试的时刻[信息图]

在本指南中,我们将全面了解有关 A/B测试 的所有内容。 我们将介绍不同类型的A/B测试,如何有效地规划和启动测试,如何评估测试是否成功,您应该关注哪些指标,多年来我们发现的常见错误等等。 什么是A/B测试? A/B测试(有时称为“分割测试”)是一种实验类型,其中您创建两种或多种内容变体——如登录页面、电子邮件或广告——并将它们显示给不同的受众群体,以查看哪一种效果最好。 本质上,A/B测