用于实现读取某个类型的文件,如​​txt​​​,然后对文件内容进行处理之后,输出到另一个文件​​csv​​。

需要根据指定的输入文件绝对路径,得到修改后缀之后的文件绝对路径,用于在本地创建。

首先是获取文件绝对路径字符串中的后缀(扩展名),实现思路是,右边第一​​.​​之后的字符串就是文件扩展名。

/*
pFilePath:文件的绝对路径
pOutFileExt:文件的后缀名
pOutFileName:不含文件后缀的文件路径
return:0-执行成功, -1-执行失败
*/
int GetFileExt(char *pFilePath, char *pOutFileExt, char *pOutFileName)
{
char *pDest = NULL;
int iResult = 0;
int iFullPathLen = 0;
int iFileExtLen = 0;
char szFullPathName[500] = {0};

//参数不合法
if ((NULL == pFilePath) || (NULL == pOutFileExt) || (NULL == pOutFileName))
{
printf("file is null\n");
return -1;
}
printf("filePath=%s\n", pFilePath);

//文件路径去掉\0后存入本地数组
_snprintf(szFullPathName,sizeof(szFullPathName)-1, "%s", pFilePath);

//文件完整路径的长度
iFullPathLen = strlen(szFullPathName); //12

//右边.的位置
pDest = strrchr(szFullPathName, '.'); //p+8
//没有找到.
if (NULL == pDest)
{
return -1;
}

//后缀的起始下标p+iResult
iResult = pDest - szFullPathName + 1; //p+8-p+1=9

//后缀长度
iFileExtLen = iFullPathLen - iResult; //12-9=3,

if (iFileExtLen > 0)
{
memcpy(pOutFileExt, szFullPathName+iResult, iFileExtLen);
memcpy(pOutFileName, szFullPathName, iFullPathLen-iFileExtLen-1);
}
else
{
*pOutFileName = 0;
*pOutFileExt = 0;
}

return 0;
}

然后是在不含文件后缀的文件路径字符串后面,拼接指定的后缀字符串。

/*
pFilePath: 输入文件的绝对路径,含文件扩展名
pOutFilePath: 修改扩展名后的文件的绝对路径
pOutExt: 输出文件的扩展名,如"csv"

example:

*/
int ModifyFileExt(char *pFilePath, char *pOutFilePath, const char *pOutExt)
{
char szOutFileName[100] = {0};
char szFileExt[100] = {0};
char szOutFilePath[200] = {0};

//参数不合法
if(NULL == pFilePath || NULL == pOutFilePath || NULL == pOutExt)
return;

//解析失败
if(-1 == GetFileExt(pFilePath, szFileExt, szOutFileName))
return -1;

// printf("path:[%s], ext:[%s], name:[%s]\n", pFilePath, szFileExt, szOutFileName);
snprintf(szOutFilePath, sizeof(szOutFileName), "%s.%s", szOutFileName, pOutExt);

memcpy(pOutFilePath, szOutFilePath, strlen(szOutFilePath));

return 0;
}

实际调用:

#include "stdio.h"
#include "stdlib.h"
#include "string.h"

int ModifyFileExt(char *pFilePath, char *pOutFilePath, const char *pOutExt);
int GetFileExt(char *pFilePath, char *pOutFileExt, char *pOutFileName);

int main(void)
{
char szFilePathOut[500] = {0};
const char szFilePathIn[] = "D:/abc.txt";
int ret = 0;

ret = ModifyFileExt(szFilePathIn, szFilePathOut, "csv");

if(ret != -1)
printf("file in:[%s], file out:[%s]\n", szFilePathIn, szFilePathOut);
else
printf("filepath is null\n");

return 0;
}

输出结果:

$ ./a.exe
filePath=D:/abc.txt
file in:[D:/abc.txt], file out:[D:/abc.csv]