Подтвердить что ты не робот

Легкий способ удалить расширение из имени файла?

Я пытаюсь захватить необработанное имя файла без расширения из имени файла, переданного в аргументах:

int main ( int argc, char *argv[] )
{
    // Check to make sure there is a single argument
    if ( argc != 2 )
    {
        cout<<"usage: "<< argv[0] <<" <filename>\n";
        return 1;
    }

    // Remove the extension if it was supplied from argv[1] -- pseudocode
    char* filename = removeExtension(argv[1]);

    cout << filename;

}

Имя файла должно быть, например, "test", когда я передал "test.dat".

4b9b3361

Ответ 1

size_t lastindex = fullname.find_last_of("."); 
string rawname = fullname.substr(0, lastindex); 

Остерегайтесь случая, когда нет "." и он возвращает npos

Ответ 2

Это работает:

std::string remove_extension(const std::string& filename) {
    size_t lastdot = filename.find_last_of(".");
    if (lastdot == std::string::npos) return filename;
    return filename.substr(0, lastdot); 
}

Ответ 3

Следующие действия для std::string:

string s = filename;
s.erase(s.find_last_of("."), string::npos);

Ответ 4

По-моему, это проще всего и наиболее читаемое решение:

#include <boost/filesystem/convenience.hpp>

std::string removeFileExtension(const std::string& fileName)
{
    return boost::filesystem::change_extension(fileName, "").string();
}

Ответ 5

Для тех, кому нравится boost:

Использовать boost:: filesystem:: path:: stem. Он возвращает имя файла без последнего расширения. Итак. /myFiles/foo.bar.foobar становится foo.bar. Поэтому, когда вы знаете, что имеете дело только с одним расширением, вы можете сделать следующее:

boost::filesystem::path path("./myFiles/fileWithOneExt.myExt");
std::string fileNameWithoutExtension = path.stem().string();

Когда вам приходится иметь дело с несколькими расширениями, вы можете сделать следующее:

boost::filesystem::path path("./myFiles/fileWithMultiExt.myExt.my2ndExt.my3rdExt");
while(!path.extension().empty())
{
    path = path.stem();
}

std::string fileNameWithoutExtensions = path.stem().string();

(взято здесь: http://www.boost.org/doc/libs/1_53_0/libs/filesystem/doc/reference.html#path-decomposition, найденное в разделе стека)

BTW также работает с корневыми дорожками.

Ответ 6

Вы можете сделать это легко:

string fileName = argv[1];
string fileNameWithoutExtension = fileName.substr(0, fileName.rfind("."));

Обратите внимание, что это работает, только если есть точка. Вы должны проверить прежде, если есть точка, но вы получите эту идею.

Ответ 7

Если кто-то просто хочет простое решение для Windows:

Используйте PathCchRemoveExtensionMSDN

... или PathRemoveExtension (устарел!) → MSDN

Ответ 8

Просто пройдите по списку и замените первое (или последнее) появление символа '.' с терминатором NULL. Это закончит строку в этой точке.

Или сделайте копию строки до ".", но только если вы хотите вернуть новую копию. Это может стать беспорядочным, поскольку динамически выделяемая строка может быть источником утечки памяти.

for(len=strlen(extension);len>= 0 && extension[len] != '.';len--)
     ;

char * str = malloc(len+1);

for(i=0;i<len;i++)
  str[i] = extension[i];

 str[i] = '\0'l