C/C++ Windows和Linux通用的一个函数,从文件路径中 提取 (文件名) 和 (文件后缀)

Windows使用vscode连接Linux虚拟机编写C/C++程序 文章目录前言一、安装vs code1.2.二、配置服务器1.2.总结 前言 学生党,想要深入学习在linux上编程C/C++。而笔记本电脑性能一般,虚拟机开着桌面版得Linux卡得要死,服务器版的Linux看着黑乎乎的窗口完全无感,因此打算使用vs code远程连接linux虚拟机进行学习。 特别写下这篇博客,记录下vs code远程连接虚拟机的步骤。 环境:windows10、VMware软件、Ubuntu 20.10服务器版 一、安装vs code 1. 进入官网https://code.visua 阅读详情

假如给你一个文件路径,你可以将其中的文件名和文件后缀提取出来嘛?
不会没有关系,此篇博客提供一个函数,即可在Windows环境下调用,也可以在Linux环境下调用,去获取一个文件路径的文件名和文件后缀!


一、返回值 bool 版

需要包含头文件:
#include <stdio.h>
#include <string.h>
#include <string>

代码如下:

/******************************************************************************
 *
 * 功能:
 *		获得 (文件名.后缀) 和 (文件名) 和 (文件后缀),Windows和Linux通用!
 *
 * 参数:
 *		_filePaht:C语言字符指针,文件路径字符串
 *		_fileName:C++字符串引用,获得[(文件名.后缀)|(文件名)]返回
 *		_fileName:C++字符串引用,获得(文件名.后缀)返回
 *		_fileSuffix:C++字符串引用,获得(后缀)返回
 *		_dot:true,后缀带点(.txt);false,后缀不带点(txt);默认值为true
 *
 * 返回值:
 *		成功返回true,失败返回false
 *
 ******************************************************************************/
bool get_fileName_fileSuffix(const char *_filePaht, std::string &_fileNames, std::string &_fileName, std::string &_fileSuffix, bool _dot = true) {

	// 合法性检查
	if (!_filePaht) return false;
	std::string str = _filePaht;
	if (str.empty()) return false;


	// .txt    的情况
	if (str.at(0) == '.') return false;
	// file.   的情况
	if (str.at(str.size() - 1) == '.') return false;
	

	char c = '\0';

// 区分此函数是在Windows环境调用还是Linux环境调用
#if defined (_WIN64) || defined (WIN32) || defined (_WIN32)
	//printf("---Windows---\n");
	c = '\\';
#else
	//printf("---Linux---\n");
	c = '\/';
#endif

	// 去除字符串中的路径,剩下文件名
	std::string filename = strrchr(_filePaht, c) == NULL ? "" : strrchr(_filePaht, c) + 1;
	if (filename == "") {
		/* 说明字符串是file.txt或者file形式 */
		filename = _filePaht;
	
	} else {
		/* 说名字符串是C:\\abc\\file.txt或者C:\\abc\\file形式 */
	}

	// 找到 . 的位置
	size_t _size = filename.rfind(".");
	// 获得文件名,不包含后缀
	_fileName = filename.substr(0, _size);

	// 获得文件后缀
	std::string strsuffix = "";
	if (_size != -1) {	// 不等于-1说明有后缀 file.txt形式

		// true后缀带点,false后缀不带点
		if (_dot == true) {
			strsuffix = filename.substr(_size);     // 文件后缀 .txt

		} else {
			strsuffix = filename.substr(_size + 1);     // 文件后缀 txt
		}
	}
	// 后缀
	_fileSuffix = strsuffix;

	// 获得文件名.后缀(file.txt | file)
	_fileNames = filename;

	return true;
}

具体过程就不解释了,都有详细注释,去看,去理解吧。

  1. 测试Windows路径:
    C:\abc\file.txt
    C:\abc\file
    file.txt
    file

    int main(void) {
    
    	// C:\\abc\\file.txt
    	// C:\\abc\\file
    	// file.txt
    	// file
    
    	std::string fileNames = "";
    	std::string fileName = "";
    	std::string fileSuffix = "";
    	bool suffix = true;
    	bool flag = false;
    
    	//printf("---Windows---\n");
    
    	flag = get_fileName_fileSuffix("C:\\abc\\file.txt", fileNames, fileName, fileSuffix, suffix);
    	printf("str = %s, fileNames = %s   fileName = %s   fileSuffix = %s   flag = %d\n\n", "C:\\abc\\file.txt", fileNames.c_str(), fileName.c_str(), fileSuffix.c_str(), flag);
    
    	flag = get_fileName_fileSuffix("C:\\abc\\file", fileNames, fileName, fileSuffix, suffix);
    	printf("str = %s, fileNames = %s   fileName = %s   fileSuffix = %s   flag = %d\n\n", "C:\\abc\\file", fileNames.c_str(), fileName.c_str(), fileSuffix.c_str(), flag);
    
    	flag = get_fileName_fileSuffix("file.txt", fileNames, fileName, fileSuffix, suffix);
    	printf("str = %s, fileNames = %s   fileName = %s   fileSuffix = %s   flag = %d\n\n", "file.txt", fileNames.c_str(), fileName.c_str(), fileSuffix.c_str(), flag);
    
    	flag = get_fileName_fileSuffix("file", fileNames, fileName, fileSuffix, suffix);
    	printf("str = %s, fileNames = %s   fileName = %s   fileSuffix = %s   flag = %d\n\n", "file", fileNames.c_str(), fileName.c_str(), fileSuffix.c_str(), flag);
    
    	fileNames = "";
    	fileName = "";
    	fileSuffix = "";
    	flag = get_fileName_fileSuffix("", fileNames, fileName, fileSuffix, suffix);
    	printf("str = %s, fileNames = %s   fileName = %s   fileSuffix = %s   flag = %d\n\n", "\"\"", fileNames.c_str(), fileName.c_str(), fileSuffix.c_str(), flag);
    
    	return 0;
    }
    

    运行截图:
    这个是后缀带点(.txt)的测试
    在这里插入图片描述

  2. 测试Linux路径:
    /abc/file.txt
    /abc/file
    file.txt
    file

    int main(void) {
    
    	std::string fileNames = "";
    	std::string fileName = "";
    	std::string fileSuffix = "";
    	bool suffix = false;
    	bool flag = false;
    
    	// /abc/file.txt
    	// /abc/file
    	// /file.txt
    	// file
    	//printf("---Linux---\n");
    
    	flag = get_fileName_fileSuffix("/abc/file.txt", fileNames, fileName, fileSuffix, suffix);
    	printf("str = %s, fileNames = %s   fileName = %s   fileSuffix = %s   flag = %d\n\n", "/abc/file.txt", fileNames.c_str(), fileName.c_str(), fileSuffix.c_str(), flag);
    
    	flag = get_fileName_fileSuffix("/abc/file", fileNames, fileName, fileSuffix, suffix);
    	printf("str = %s, fileNames = %s   fileName = %s   fileSuffix = %s   flag = %d\n\n", "/abc/file", fileNames.c_str(), fileName.c_str(), fileSuffix.c_str(), flag);
    
    	flag = get_fileName_fileSuffix("file.txt", fileNames, fileName, fileSuffix, suffix);
    	printf("str = %s, fileNames = %s   fileName = %s   fileSuffix = %s   flag = %d\n\n", "/file.txt", fileNames.c_str(), fileName.c_str(), fileSuffix.c_str(), flag);
    
    	flag = get_fileName_fileSuffix("file", fileNames, fileName, fileSuffix, suffix);
    	printf("str = %s, fileNames = %s   fileName = %s   fileSuffix = %s   flag = %d\n\n", "/file", fileNames.c_str(), fileName.c_str(), fileSuffix.c_str(), flag);
    
    	return 0;
    }
    

    运行截图:
    这个是后缀不带点(txt)的测试
    在这里插入图片描述


二、返回值 后缀索引 版

第一个版本是两个星期前写好的,后续回来看后,觉得返回值好像不是太友好,于是乎更改了以下版本代码。
返回的是 后缀索引 。

处理过程不变!

需要包含头文件:
#include <stdio.h>
#include <string.h>
#include <string>

/******************************************************************************
 *
 * 功能:
 *		获得 (文件名.后缀) 和 (文件名) 和 (文件后缀),Windows和Linux通用!
 *
 * 参数:
 *		_filePaht:			C语言字符指针,文件路径字符串
 *		_fullFileName:		C++字符串引用,获得[(文件名.后缀) 或 (文件名)]返回
 *		_fileName:			C++字符串引用,获得(文件名.后缀)返回
 *		_fileSuffix:		C++字符串引用,获得(后缀)返回
 *		_dot:				true,后缀带点(.txt);false,后缀不带点(txt);默认值为true
 *
 * 返回值:
 *		有后缀返回"."的索引;没有后缀则返回-1
 *
 ******************************************************************************/
int get_fileName_fileSuffix(const char *_filePaht, std::string &_fullFileName, std::string &_fileName, std::string &_fileSuffix, bool _dot = true) {

	// 合法性检查
	if (!_filePaht) return -1;
	std::string str = _filePaht;
	if (str.empty()) return -1;

	// .txt    的情况
	if (str.at(0) == '.') return -1;
	// file.   的情况
	if (str.at(str.size() - 1) == '.') return -1;



	char c = '\0';

	// 区分此函数是在Windows环境调用还是Linux环境调用
#if defined (_WIN64) || defined (WIN32) || defined (_WIN32)
	//printf("---Windows---\n");
	c = '\\';
#else
	//printf("---Linux---\n");
	c = '\/';
#endif

	// 去除字符串中的路径,剩下文件名
	std::string filename = strrchr(_filePaht, c) == NULL ? "" : strrchr(_filePaht, c) + 1;
	if (filename == "") {
		/* 说明字符串是file.txt或者file形式 */
		filename = _filePaht;

	} else {
		/* 说名字符串是C:\\abc\\file.txt或者C:\\abc\\file形式 */
	}

	// 找到 . 的位置
	size_t _size = filename.rfind(".");
	// 获得文件名,不包含后缀
	_fileName = filename.substr(0, _size);

	// 获得文件后缀
	std::string strsuffix = "";
	if (_size != -1) {	// 不等于-1说明有后缀 file.txt形式

		// true后缀带点,false后缀不带点
		if (_dot == true) {
			strsuffix = filename.substr(_size);     // 文件后缀 .txt

		} else {
			strsuffix = filename.substr(_size + 1);     // 文件后缀 txt
		}
	}
	// 后缀
	_fileSuffix = strsuffix;

	// 获得文件名.后缀(file.txt | file)
	_fullFileName = filename;

	return _size;
}

测试:

int main(void) {

	std::string str = "abc.jpg";
	//std::string str = ".abcjpg";
	//std::string str = "abcjpg.";
	std::string fullFilename, filename, fileSuffix;
	int r = get_fileName_fileSuffix(str.c_str(), fullFilename, filename, fileSuffix, true);
	printf("r = %d\n", r);
	printf("fullFilename = %s   filename = %s   fileSuffix = %s\n", fullFilename.c_str(), filename.c_str(), fileSuffix.c_str());


	return 0;
}

运行截图:
在这里插入图片描述


总结

本人在做项目时经常需要在一个路径中提取出文件名和文件路径,但是在项目中写的是零散的代码,所以在这里总结成一个函数,通过这个函数去获取就方便多了,而且windows和linux通用!(废了两个三个小时写代码、测试和写博客,值得!)

VsCode C/C++ 开发环境配置最全详细教程 Windows / Linux 均适用 vscode C/C++ 开发环境配置最全教程 windows/linux均适用 1.1.安装VSCode 下载地址:https://code.visualstudio.com/ 选择适合自己系统的下载之后安装就行, 注意:建议直接安装在C盘,方便配置,软件大小本身不大!!! ... 阅读详情

相关推荐

利用C/C++编写程序以获取文件夹内所有子文件名,windows和Linux两个版本都有

利用C/C++编写程序以获取文件夹内所有子文件名,windows和Linux两个版本都有

wei_god的专栏 1205

opencv3/C++ 将图片转换为视频

现有一些图片按顺序放置在一文件夹jogging1\下,如图: 需要将其合并转换为一个视频。 示例: 环境:Win7+OpenCV3+VS2012 #include&lt;opencv2/opencv.hpp&gt; #include &lt;stdio.h&gt; #include &lt;io.h&gt; #include &lt;string&gt; #include &lt;i...

akadiao的博客 1万+

C++ 提取路径文件名、后缀名等

C++ 提取路径文件名、后缀名等

weixin_43896283的博客 1577

OpenCV--C++图像/视频读取与保存

一、图像的读取 #include <opencv2\opencv.hpp> #include <iostream> using namespace std; using namespace cv; //opencv的命名空间 int main(int argc, char** argv) { Mat img; //声明一个保存图像的类 img = imread("1.jpg"); if (img.empty()) //判断图像文件是否存在

ssunshining的博客 7209

【opencv-c++】将图像保存为本地的视频文件

1、实例化VideoWriter类为一个对象,例如writer对象;将图像保存为本地的视频文件,需要使用VideoWriter类。-4、writer.open打开实例化后的writer对象。-5、writer.write(src)循环写入图像。运行结束,将在本地磁盘生成live.avi视频文件。注意帧宽、帧高、是否彩色须与实际存入的图像一致。创建的opencv_start项目目录如下,-3、指定帧率,帧宽、帧高、是否是彩色。注意需要添加下图中的动态链接库。-2、指定视频的编解码器;......

jn10010537的博客 2133

linux c++ 获取目录下所有文件

这是一个用于获取指定目录下所有文件的信息的C++代码, 是用于linux系统的

C/C++ 获取文件夹下所有文件名 windows和linux通用

参考: http://www.cnblogs.com/xudong-bupt/p/3504442.html ################################################# 利用C/C++编写程序以获取文件夹内所有子文件名,以下程序参考网络上诸多博文: 头文件如下: #include #include #include #inc

u012005313的专栏 4万+

C51编程25-应用篇(单片机与电脑端实现wifi通讯)

单片机使用ESP-01S wifi模块与电脑端进行数据通讯。

qq_34343637的博客 1万+

windows与linux C/C++对比(一)文件路径操作

说明         在windows与linux跨平台移植C/C++程序中,有一些相同函数名的函数,实际使用存在一定区别,特此记录并加以对比说明。         Windows系统为Windows10家庭版,Linux系统为Ubuntu16.04.6服务器版,Windows下使用开发环境为visual studio 2017,Linux下采用VS

NCEPUautomation的博客 4876

WinForm轻松打造AntDesign现代化工具栏

摘要: 本文介绍如何在WinForm中利用AntdUI库实现AntDesign风格工具栏,包括安装配置、动态生成按钮/下拉菜单、布局优化及主题美化。通过AntButton、AntDropdown等控件结合事件绑定,可快速构建支持图标、工具提示、权限控制的现代化工具栏,并解决常见图标加载、布局错乱问题。最后提供代码示例与响应式设计技巧,助你打造高效美观的WinForm界面。 (字数:150)

java专栏 1589

【嵌入式原理系列-第七篇】ld脚本实战:从零构建MCU内存布局

本文是一篇针对嵌入式开发者的实战指南,详细讲解了如何从零开始为MCU编写ld链接器脚本以构建自定义内存布局。文章以STM32F103C8T6为例,深入剖析了MEMORY和SECTIONS指令的用法,并提供了OTA分区、非易失数据存储等高级定制案例,帮助开发者解决实际工程中的Flash与RAM管理难题,实现对程序运行的深度掌控。

weixin_29271263的博客 246

C语言实现获取完整路径下的文件名及后缀(附带源码)

C语言实现获取完整路径下的文件名及后缀(附带源码)

欢迎来到我的博客!这里是一个专注于计算机技术的分享平台,涵盖编程开发、算法研究、系统架构、软件工程等多个领域。无论你是初学者还是资深开发者,都能在这里找到有价值的内容。 1889

【图形学】Loop细分算法及半边结构实现(C++)

文章目录Loop 细分算法介绍增加新顶点更新旧顶点算法实现半边结构半边结构的表示方法半边结构的构造方法创建所有顶点创建所有面及半边半边结构的使用 Loop 细分 顾名思义,网格细分是将粗糙网格精细化的过程,如下动图。Loop细分是众多网格细分算法的一种,Loop细分仅仅对三角形网格模型有效。值得注意的是,虽然叫Loop细分,但是不能理解为“循环”细分,叫这个名字是因为作者的名字是这个而已。 下面是一个粗糙的兔子模型1000个面,进行3次细分 算法介绍 Loop细分算法主要分两步进行 增加新顶点:增加

wk_119的博客 8066

[C/C++] 获取当前程序路径(windows 和 linux)

// 定义变量,用户存放程序路径 TCHAR m_InstallPath[2*MAX_PATH] = {0x00}; //************************************ // Method: GetInstallPath // FullName: CPrintClientDlg::GetInstallPath // Access: public...

就是那个党伟 7699

微波射频学习笔记18-------偶极子天线和微波天线设计介绍

几种天线设计方法的介绍 一、偶极子天线 1.天线模型 两根紧挨着的金属导体,长度均为四分之一波长,直径均远小于波长,两导体间距也远小于波长。 2.天线性能的设计因素 ① 单个导体长度L:(光速/频率)/4=四分之一波长(在空气中传播的波长),但在导体中传播,波长会变短; ② 导体半径R:远小于波长即可,使用导电率高些的材料,市面上常见直径零点几毫米就挺好,或者用波长/200,得出一个小200的值,也算远小于波长; ③ 两导体间距S:远小于波长即可,可以比半径更小点。 以上三个变量L、R、S,均可在仿真软件

Sil_sprout 1万+

热力学仿真软件:COMSOL Heat Transfer_(18).案例研究:工业加热炉优化

工业加热炉的优化设计和操作参数调整是提高制造过程效率和产品质量的关键。通过仿真软件如COMSOL Multiphysics,可以精确地分析炉内的温度分布、能耗和热损失,从而提出有效的优化方案。本文通过一个实际应用案例,展示了如何利用仿真技术进行工业加热炉的综合优化,并通过实验验证了优化方案的有效性。希望这些方法和案例可以为其他制造企业提供参考,帮助他们在实际生产中提高加热炉的性能和效率。

kkchenjj的博客 1008

C/C++开发环境

如同, 缺少了对cJSON的编译,这里对成员函数的所需的c/cpp文件未被编译。也就是按单文件编译方法对多文件进行编译。解决办法:在tasks.jason 中设置源文件,将"args"的值语言CC++C/C++这里的 ${fileDirname} 表示当前目录。

Watom_663的博客 3287

【Agent从入门到实践】40 容错优化:异常处理、重试机制、降级策略

各位小伙伴,咱们的多Agent框架一路优化到现在,决策快、执行效率高、资源用得省,看似啥都行,但只要一遇到网络波动、工具故障、数据异常调用web_search工具时网络超时,整个检索任务直接失败,写作Agent没数据可用向量库连接异常,向量检索直接崩掉,依赖检索结果的Agent全趴窝单个Agent执行出错,整个并行任务流程直接中断,前功尽弃高并发下部分工具调用失败,框架没有备用方案,只能返回任务失败说白了,咱们之前的框架只有正常执行逻辑,没有异常兜底逻辑。

人工智能AI技术 908

Windows环境使用VSCode 调试Linux环境C/C++代码

在Win10中,配置VScode调试Linux环境下的C语言的代码,配置过程不太常用,特此记录下。 1、源码文件,都一样,怎么写看个人爱好。 2、VSCode安装这里也不做赘述。VSCode默认安装好是使用的英文,想要中文界面,可以在扩展中安装中文语言包就可以了,如下图: 安装完成后,会提示重启,按照提示操作即可。 3、安装远程插件并配置 由于Window上编译Linux系统下的代码,因此可将Linux看作是另外一台电脑,不管是不是虚拟机,容器之类的,或...

kelleo的博客 1万+

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

C/C++创建多级目录函数,支持windows和linux

C/C++创建多级目录函数,支持windows和linux 分类: C/C++学习2012-07-03 10:03 3048人阅读 评论(0) 收藏 举报 windowsaccesslinuxnull 转载自:http://tianyou8.blog.hexun.com/57206664_d.html 1。首先请加上这些预编译 [cpp

jfkidear的专栏 1472

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

从Windows向Linux的C和C++代码移植

https://www.it610.com/article/1281323325649338368.htm 从Windows向Linux的C和C++代码移植 从Windows向Linux的C/C++代码移植 一 准备移植 熟悉linux编程环境 ⑴linux版本: redhat系列:redhat (7.2 , 8.0, 9.0, AS *, Fedora Core *) debian系列:ubuntu (6.06 , …) suse系列:s...

u010451780的专栏 1324

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

快速指南:C/C++程序员如何从 Windows 向 Linux 迁移

老朽在 DOS、Windows 下玩 C/C++ 三十多年了,转到 Linux(Ubuntu)下,感觉整个开发环境乱七八糟、毫无头绪。在安装配置 OpenCV 4.5.1 的时候,经过一番折腾,发现 Linux 和 Windows 没啥本质区别。本文把关键要素稍加整理,供从 Windows 向 Linux 迁移的程序员同行们参考。

程序猿视角 5950

在 Windows 和 Linux 下使用 C/C++ 连接 MySQL 的详细指南

C/C++ 连接 MySQL

威桑的博客 1506

C++文件路径处理:从基础到进阶,掌握文件名与扩展名提取技巧

在软件开发中,文件路径操作是数据I/O、配置管理和资源加载的基础。其核心原理在于字符串解析,通过定位路径分隔符和扩展名分隔符来提取关键信息。掌握高效的文件路径处理技术,能显著提升程序的健壮性和跨平台兼容性,避免因路径格式差异或边界情况导致的错误。这一技术广泛应用于日志记录、批量文件处理、插件系统加载等场景。本文聚焦于C++中的实现,深入探讨了如何利用标准库、操作系统API以及现代C++17的filesystem库,系统性地解决文件名提取和扩展名移除问题,并特别关注了跨平台路径分隔符处理、多重扩展名解析等常见

weixin_30768881的博客 265

c/c++获取可执行程序的绝对路径(Linux、Windows)

今天改动一个程序,需要在linux环境获取执行程序的绝对路径,搜索到两个函数,在此做下记录和对比。 函数1:char *getcwd(char *buf, size_t size); 头文件:unistd.h 获取到可执行程序的绝对路径,存放到buf中,size是指定的buf大小。若size指定的大小比 buf短,会返回NULL。若不知道buf的...

giveaname的专栏 2万+
上一篇: C/C++ 三种方式获得文件的大小
下一篇: C/C++ getcwd 获取项目的运行路径
cpp_learners
博客等级 码龄7年 1526粉丝 274原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cpp_learners

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值