Получить имя файла без расширения? - PullRequest
4 голосов
/ 11 июля 2011

Я новичок в мире C ++, у меня возникла очень тривиальная проблема - получить имя файла без расширения.

У меня есть TCHAR переменная, содержащая sample.txt, и мне нужно извлечь только sample, я использовал функцию PathFindFileName, она просто возвращает то же значение, которое я передал.

Я попробовал поискать в Google, но все равно не повезло?!

РЕДАКТИРОВАТЬ: я всегда получаю трехбуквенное расширение файла, я добавил следующий код, но в конце я получаю что-то вроде Montage (2)««þîþ как мне избежать ненужных символов в конце?

TCHAR* FileHandler::GetFileNameWithoutExtension(TCHAR* fileName)
{
    int fileLength = _tcslen(fileName) - 4;
    TCHAR* value1 = new TCHAR;
    _tcsncpy(value1, fileName, fileLength);
    return value1;
}

Ответы [ 5 ]

7 голосов
/ 16 июля 2011

Вы можете использовать функцию PathRemoveExtension , чтобы удалить расширение из имени файла.

Чтобы получить только имя файла ( с расширением ), вам может понадобиться сначала использовать PathStripPath , а затем PathRemoveExtension.

5 голосов
/ 11 июля 2011

Вот как это делается.

#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);
}

Возвращает std :: string или std :: wstring в соответствии с настройкой UNICODE.Чтобы вернуться к TCHAR *, вам нужно использовать StringType :: c_str ();Это константный указатель, поэтому его нельзя изменить, и он недействителен после уничтожения созданного им строкового объекта.

2 голосов
/ 11 июля 2011
TCHAR* FileHandler::GetFileNameWithoutExtension(TCHAR* fileName)
{
    int fileLength = _tcslen(fileName) - 4;
    TCHAR* value1 = new TCHAR[fileLength+1];
    _tcsncpy(value1, fileName, fileLength);
    return value1;
}
2 голосов
/ 11 июля 2011

Попробуйте приведенное ниже решение,

string fileName = "sample.txt";
size_t position = fileName.find(".");
string extractName = (string::npos == position)? fileName : fileName.substr(0, position);
1 голос
/ 11 июля 2011

Попробуйте это:

Предполагается, что имя файла находится в строке.

string fileName = your file.

string newFileName;

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

Это подсчитает буквы в вашем исходном имени файла и добавит их одну за другой в новую строку имени файла.

Есть несколько способов сделать это, но это один из основных способов сделать это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...