【ARM 嵌入式 C 文件操作系列 20.2 -- C代码修改文件扩展名】

2024-04-03 22:36

本文主要是介绍【ARM 嵌入式 C 文件操作系列 20.2 -- C代码修改文件扩展名】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!


请阅读【嵌入式开发学习必备专栏 】


文章目录

    • C代码修改文件扩展名

C代码修改文件扩展名

下面是一个函数,它接收文件名 filename 和新的扩展名 ext,然后生成并返回一个新的文件名。这个新文件名不包含路径,也不包含原有的扩展名,而是添加了新的扩展名 ext

为了简化问题,假设 filename 是合法的,并且新的扩展名 ext 不包含点号 .

#include <stdio.h>
#include <stdlib.h>
#include <string.h>char* change_file_extension(const char *filename, const char *ext) 
{// 查找最后一个目录分隔符(如果存在)const char *last_slash = strrchr(filename, '/');if (last_slash == NULL) {last_slash = filename; // 没有目录分隔符,整个字符串都是文件名} else {last_slash++; // 移动到最后一个斜杠之后的第一个字符}// 查找最后一个点号以获取文件扩展名(如果存在)const char *last_dot = strrchr(last_slash, '.');if (last_dot == NULL) {last_dot = filename + strlen(filename); // 没有扩展名,指向字符串末尾}// 计算新文件名的长度(不包括终结符)size_t new_name_length = (last_dot - last_slash) + strlen(ext);// 分配新字符串char *new_name = malloc(new_name_length + 1); if (new_name == NULL) {perror("内存分配失败");return NULL;}// 复制文件名到新字符串strncpy(new_name, last_slash, last_dot - last_slash);new_name[last_dot - last_slash] = '\0'; // 确保字符串终结符// 追加新的扩展名strcat(new_name, ext);return new_name;
}int main(void) 
{const char *filename = "/path/to/myfile.txt";const char *new_ext = "jpg";char *new_filename = change_file_extension(filename, new_ext);if (new_filename != NULL) {printf("新文件名为: %s\n", new_filename);free(new_filename); // 记得释放分配的内存}return 0;
}

这个 change_file_extension 函数使用 strrchr 来定位 filename 中最后一个斜杠 / 和点号 . 的位置。如果 filename 中包含路径,最后一个斜杠后面的部分将被视为文件名。函数然后根据这些位置信息来构造新文件名。
请注意,返回的新文件名是使用 malloc 分配的,因此调用方负责释放这块内存,以避免内存泄露。在 main 函数中,使用了 free 函数来释放分配的内存。

此函数不会检查 ext 是否以点号开始,所以调用时要确保 ext 是正确的格式。如果 ext 需要包含点号(如 .jpg),你需要相应地修改函数或调用时的参数。

这篇关于【ARM 嵌入式 C 文件操作系列 20.2 -- C代码修改文件扩展名】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设

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

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

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

【生成模型系列(初级)】嵌入(Embedding)方程——自然语言处理的数学灵魂【通俗理解】

【通俗理解】嵌入(Embedding)方程——自然语言处理的数学灵魂 关键词提炼 #嵌入方程 #自然语言处理 #词向量 #机器学习 #神经网络 #向量空间模型 #Siri #Google翻译 #AlexNet 第一节:嵌入方程的类比与核心概念【尽可能通俗】 嵌入方程可以被看作是自然语言处理中的“翻译机”,它将文本中的单词或短语转换成计算机能够理解的数学形式,即向量。 正如翻译机将一种语言

计算机毕业设计 大学志愿填报系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点赞 👍 收藏 ⭐评论 📝 🍅 文末获取源码联系 👇🏻 精彩专栏推荐订阅 👇🏻 不然下次找不到哟~Java毕业设计项目~热门选题推荐《1000套》 目录 1.技术选型 2.开发工具 3.功能

荣耀嵌入式面试题及参考答案

在项目中是否有使用过实时操作系统? 在我参与的项目中,有使用过实时操作系统。实时操作系统(RTOS)在对时间要求严格的应用场景中具有重要作用。我曾参与的一个工业自动化控制项目就采用了实时操作系统。在这个项目中,需要对多个传感器的数据进行实时采集和处理,并根据采集到的数据及时控制执行机构的动作。实时操作系统能够提供确定性的响应时间,确保关键任务在规定的时间内完成。 使用实时操作系统的

代码随想录冲冲冲 Day39 动态规划Part7

198. 打家劫舍 dp数组的意义是在第i位的时候偷的最大钱数是多少 如果nums的size为0 总价值当然就是0 如果nums的size为1 总价值是nums[0] 遍历顺序就是从小到大遍历 之后是递推公式 对于dp[i]的最大价值来说有两种可能 1.偷第i个 那么最大价值就是dp[i-2]+nums[i] 2.不偷第i个 那么价值就是dp[i-1] 之后取这两个的最大值就是d

pip-tools:打造可重复、可控的 Python 开发环境,解决依赖关系,让代码更稳定

在 Python 开发中,管理依赖关系是一项繁琐且容易出错的任务。手动更新依赖版本、处理冲突、确保一致性等等,都可能让开发者感到头疼。而 pip-tools 为开发者提供了一套稳定可靠的解决方案。 什么是 pip-tools? pip-tools 是一组命令行工具,旨在简化 Python 依赖关系的管理,确保项目环境的稳定性和可重复性。它主要包含两个核心工具:pip-compile 和 pip