4

我是 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;
}
4

5 回答 5

9

您可以使用PathRemoveExtension函数从文件名中删除扩展名。

要仅获取文件名(扩展名),您可能必须首先使用PathStripPath,然后使用PathRemoveExtension.

于 2011-07-16T06:19:26.210 回答
7

这是它是如何完成的。

#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 指针,所以你不能修改它,并且在产生它的字符串对象被销毁后它是无效的。

于 2011-07-11T07:15:58.883 回答
2

尝试以下解决方案,

string fileName = "sample.txt";
size_t position = fileName.find(".");
string extractName = (string::npos == position)? fileName : fileName.substr(0, position);
于 2011-07-11T07:02:59.077 回答
2
TCHAR* FileHandler::GetFileNameWithoutExtension(TCHAR* fileName)
{
    int fileLength = _tcslen(fileName) - 4;
    TCHAR* value1 = new TCHAR[fileLength+1];
    _tcsncpy(value1, fileName, fileLength);
    return value1;
}
于 2011-07-11T07:13:22.737 回答
1

试试这个:

假设文件名在一个字符串中。

string fileName = your file.

string newFileName;

for (int count = 0;
   fileName[count] != '.';
   count++)
{
  newFileName.push_back(fileName[count]);
}

这将计算原始文件名中的字母并将它们一一添加到新文件名字符串中。

有几种方法可以做到这一点,但这是一种基本的方法。

于 2011-07-11T07:07:17.627 回答