我是C ++世界的新手,我遇到了一个非常微不足道的问题,即获取没有扩展名的文件名。
我的TCHAR
变量包含sample.txt
,并且只需要提取sample
,我使用PathFindFileName
函数只返回我传递的相同值。
我尝试谷歌搜索解决方案,但仍然没有运气?!
编辑:我总是得到三个字母的文件扩展名,我添加了以下代码,
但最后我得到像Montage (2)««þîþ
这样的东西我怎么能避免垃圾字符?
TCHAR* FileHandler::GetFileNameWithoutExtension(TCHAR* fileName)
{
int fileLength = _tcslen(fileName) - 4;
TCHAR* value1 = new TCHAR;
_tcsncpy(value1, fileName, fileLength);
return value1;
}
答案 0 :(得分:7)
您可以使用PathRemoveExtension功能从文件名中删除扩展程序。
要仅获取文件名( 扩展名),您可能首先使用PathStripPath,然后使用PathRemoveExtension
。
答案 1 :(得分:5)
以下是它的完成方式。
#ifdef UNICODE //Test to see if we're using wchar_ts or not.
typedef std::wstring StringType;
#else
typedef std::string StringType;
#endif
StringType GetBaseFilename(const TCHAR *filename)
{
StringType fName(filename);
size_t pos = fName.rfind(T("."));
if(pos == StringType::npos) //No extension.
return fName;
if(pos == 0) //. is at the front. Not an extension.
return fName;
return fName.substr(0, pos);
}
根据UNICODE设置返回std :: string或std :: wstring。要返回TCHAR *,您需要使用StringType :: c_str();这是一个const指针,所以你不能修改它,并且在生成它的字符串对象被销毁后它无效。
答案 2 :(得分:2)
尝试以下解决方案,
string fileName = "sample.txt";
size_t position = fileName.find(".");
string extractName = (string::npos == position)? fileName : fileName.substr(0, position);
答案 3 :(得分:2)
TCHAR* FileHandler::GetFileNameWithoutExtension(TCHAR* fileName)
{
int fileLength = _tcslen(fileName) - 4;
TCHAR* value1 = new TCHAR[fileLength+1];
_tcsncpy(value1, fileName, fileLength);
return value1;
}
答案 4 :(得分:1)
试试这个:
假设文件名是字符串。
string fileName = your file.
string newFileName;
for (int count = 0;
fileName[count] != '.';
count++)
{
newFileName.push_back(fileName[count]);
}
这将计算原始文件名中的字母,并将它们逐个添加到新文件名字符串中。
有几种方法可以做到这一点,但这是一种基本的方法。