我是c / c ++的初学者,找到this获取文件的后缀,this获取文件的名称,我有使用这些方法,但我无法在这些页面中运行示例
这是我的功能
void Myfunc(char* filename)
{
cout<<GetExtension(filename);
}
错误是&#34; GetExtension&#34;未定义
请帮我获取文件后缀和名称:)
谢谢
答案 0 :(得分:2)
有很多方法可以从路径名中获取扩展名。
一种方法是使用shlwapi.dll
中的功能。您正在寻找的功能是PathFindExtensionA
。
以下代码假定您使用的是Visual Studio:
#include <shlwapi.h>
#include <iostream>
#pragma comment(lib,"shlwapi.lib")
//...
void Myfunc(char* filename)
{
std::cout << PathFindExtensionA(filename);
}
int main()
{
Myfunc("TestFile.exe");
}
使用PathFindExtensionA
的原因是您使用ANSI(char *)文件名。
请参阅以下链接: https://msdn.microsoft.com/en-us/library/bb773587%28VS.85%29.aspx
基本上,PathFindExtension
使用TCHAR
作为字符类型。根据Visual Studio项目的构建设置(同样,我假设您正在使用Visual Studio),构建将是MBCS
构建或Unicode
构建。因此,除非您的字符串类型是TCHAR
数组,否则您无法可靠地调用PathFindExtension
,除非您知道要用于调用的标准字符类型。
如果构建为Unicode
,PathFindExtension
将使用宽字符串,因此您要使用的指针类型为wchar_t*
而不是char*
。如果构建为MBCS
,则指针类型为char*
而不是wchar_t*
。是的,它让人感到困惑,但这就是它的归结。
因此,为了确保使用正确的函数,无论构建类型如何,您都可以为PathFindExtensionA
调用char*
,或为PathFindExtensionW
调用wchar_t*
。
如今,MBCS构建越来越少,因为Windows默认采用Unicode,所以我的建议是假设Unicode并使用宽字符串。
原始错误的原因是,PathFindExtension
返回的是wchar_t*
,而不是char*
,其中显示的是打印的十六进制数字而不是扩展名。由于std::cout
的运算符<<
对字符串数据如何处理wchar_t*
一无所知,因此唯一的另一个选择是输出指针值(十六进制)值得你去看看。