简单的方法来从文件名中删除扩展名?

我试图抓住原始文件名没有从parameter passing的文件名的扩展名:

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.dat”时,文件名应该是“test”。

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

在我看来,这是最简单的,最可读的解决scheme:

 #include <boost/filesystem/convenience.hpp> std::string removeFileExtension(const std::string& fileName) { return boost::filesystem::change_extension(fileName, "").string(); } 

对于那些喜欢提升的人:

使用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也适用于根path。

你可以轻松地做到这一点:

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

请注意,这只有在有点的情况下才有效。 你应该testing之前,如果有一个点,但你明白了。

如果有人只是想要一个简单的Windows解决scheme:

使用PathCchRemoveExtension – > MSDN

…或PathRemoveExtension (不build议使用!) – > MSDN

只需循环访问列表并replace“。”的第一个(或最后一个)匹配项即可。 用NULL结束符。 这将结束在这一点上的string。

或者直到“。”制作一个string的副本,但只有当你想返回一个新的副本。 这可能会变得麻烦,因为dynamic分配的string可能是内存泄漏的来源。

 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