C++版_splitpath

本文介绍了如何使用C++来解析文件全路径,分别获取文件路径、文件名和扩展名。通过两种不同的方法展示了代码实现,一种基于MFC的逆向查找,另一种通过指针从前向后分析,先找到路径,然后是扩展名,最后是文件名。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天写程序时遇到给定文件全路径求文件路径,即去掉后面的文件名称。
用MFC比较容易实现,可以用如下的示例得到
TCHAR szPath[MAX_PATH];
if( !GetModuleFileName(NULL, szPath, MAX_PATH ))
{
 printf("GetModuleFileName failed (%d)/n", GetLastError());
 return _T("");
}

CString strPath(szPath);
int nPos = strPath.ReverseFind('//');
strPath = strPath.Left(nPos + 1);

或者
TCHAR szPathName[MAX_PATH] = { 0 };
TCHAR szDrive[_MAX_DRIVE] = { 0 };
TCHAR szDir[_MAX_DIR] = { 0 };
TCHAR szFname[_MAX_FNAME] = { 0 };
TCHAR szExt[_MAX_EXT] = { 0 };
(void)::GetModuleFileName( NULL, szPathName, MAX_PATH );
_splitpath( szPathName, szDrive, szDir, szFname, szExt );

但用指针操作,更能锻练C++的功力,在网上搜索了一段代码,发觉下面的程序写的很精巧。摘录如下:

#include "stdio.h"
#include "conio.h"

void splitname(const char *szfullfilename, char *szpathname, char *szfilename, char *szextname);

int main(void)
{
 char szfullfilename[255] = "C://windows//help.txt";
 char szpathname[255];
 char szfilename[255];
 char szextname[255];

 splitname(szfullfilename, szpathname, szfilename, szextname);

 printf("%s/n", szfullfilename);
 printf("path: %s/n", szpathname);
 printf("file: %s/n", szfilename);
 printf("ext: %s/n", szextname);

}

void splitname(const char *szfullfilename, char *szpathname, char *szfilename, char *szextname)
{
 int i, j;

 i = 0;
 while (szfullfilename[i] != '/0')
  i++;
 while (szfullfilename[i] != '.')
  i--;

 j = 0;
 i++;
 while((szextname[j] = szfullfilename[i]) != '/0')
 {
  i++;
  j++;
 }
 i -= j;
 while (szfullfilename[i] != '//')
  i--;

 for (j = 0; j <= i; j++)
 {
  szpathname[j] = szfullfilename[j];
 }
 szpathname[j] = '/0';

 j = 0;
 i++;
 while((szfilename[j] = szfullfilename[i]) != '/0')
 {
  i++;
  j++;
 }
}

上面的程序,是从后向前分析的,先找出后缀名,再找出路径名,最后分析文件名。

根据上面的程序,我自己改写了,从前向后分析,先得到路径名,再得到后缀名,最后得到文件名。

改写程序如下:
void splitname(const char *szfullfilename, char *szpathname, char *szfilename, char *szextname)
{
 int i, j;

 i = 0;
 while (szfullfilename[i] != '/0')
  i++;
 while (szfullfilename[i] != '//')
  i--;

 for (j = 0; j <i; j++)
 {
  szpathname[j] = szfullfilename[j];
 }
 szpathname[j] = '/0';

  j = 0;
 i++;
  while((szfilename[j] = szfullfilename[i]) != '/0')
 {
  i++;
  j++;
 }

 while (szfullfilename[i] != '.')
  i--;

 j = 0;
 i++;
 while((szextname[j] = szfullfilename[i]) != '/0')
 {
  j++;
  i++;
 }
}

过程基本是复制的。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值