简单的方法来从文件名中删除扩展名?
我试图抓住原始文件名没有从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