Ответ 1
size_t lastindex = fullname.find_last_of(".");
string rawname = fullname.substr(0, lastindex);
Остерегайтесь случая, когда нет "." и он возвращает npos
Я пытаюсь захватить необработанное имя файла без расширения из имени файла, переданного в аргументах:
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".
size_t lastindex = fullname.find_last_of(".");
string rawname = fullname.substr(0, lastindex);
Остерегайтесь случая, когда нет "." и он возвращает npos
Это работает:
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);
}
Следующие действия для std::string:
string s = filename;
s.erase(s.find_last_of("."), string::npos);
По-моему, это проще всего и наиболее читаемое решение:
#include <boost/filesystem/convenience.hpp>
std::string removeFileExtension(const std::string& fileName)
{
return boost::filesystem::change_extension(fileName, "").string();
}
Для тех, кому нравится 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 также работает с корневыми дорожками.
Вы можете сделать это легко:
string fileName = argv[1];
string fileNameWithoutExtension = fileName.substr(0, fileName.rfind("."));
Обратите внимание, что это работает, только если есть точка. Вы должны проверить прежде, если есть точка, но вы получите эту идею.
Если кто-то просто хочет простое решение для Windows:
Используйте PathCchRemoveExtension
→ MSDN
... или PathRemoveExtension
(устарел!) → MSDN
Просто пройдите по списку и замените первое (или последнее) появление символа '.' с терминатором 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