C++ 这就是我在特定文本文件中检查文件扩展名的方式吗?
您好,我正在尝试实现一种方法来检查特定文本文件中的文件扩展名下面的代码似乎不符合我的要求,但我想知道这是否是执行此操作的正确方向。若并没有,那个么有什么库可以让我用尽可能少的代码来实现这一点呢C++ 这就是我在特定文本文件中检查文件扩展名的方式吗?,c++,string,file-extension,C++,String,File Extension,您好,我正在尝试实现一种方法来检查特定文本文件中的文件扩展名下面的代码似乎不符合我的要求,但我想知道这是否是执行此操作的正确方向。若并没有,那个么有什么库可以让我用尽可能少的代码来实现这一点呢 string fn = ".txt"; if(fn.substr(fn.find_last_of(".") + 1) == ".txt") { fprintf(stderr,"yes"); } else { fprintf(stderr,"no"); } windows 7上32位的im
string fn = ".txt";
if(fn.substr(fn.find_last_of(".") + 1) == ".txt") {
fprintf(stderr,"yes");
} else {
fprintf(stderr,"no");
}
windows 7上32位的im
fn.substr(fn.find\u last\u of(“.”+1)
返回不带点的“txt”
。因此,从substr
中删除+1
,或者与“txt”
进行比较,但不带点 fn.substr(fn.find_last_of(“.”+1)
返回不带点的“txt”
。因此,从substr
中删除+1
,或者与“txt”
进行比较,但不带点 我认为boost文件系统库应该对您有所帮助(扩展路径函数)
我认为boost文件系统库应该对您有所帮助(扩展路径函数)
我首选的解决方案是
boost::filesystem
,正如负号所示,
但如果不是:
static std::string const targetExtension( ".txt" );
if ( filename.size() >= targetExtension.size()
&& std::equal( filename.end() - targetExtension.size(),
filename.end(),
targetExtension.begin() ) ) {
std::cerr << "yes";
} else {
std::cerr << "no";
}
static std::string const targetExtension(“.txt”);
如果(filename.size()>=targetExtension.size())
&&std::equal(filename.end()-targetExtension.size(),
filename.end(),
targetExtension.begin()){
std::cerr我首选的解决方案是boost::filesystem
,如负号所示,
但如果不是:
static std::string const targetExtension( ".txt" );
if ( filename.size() >= targetExtension.size()
&& std::equal( filename.end() - targetExtension.size(),
filename.end(),
targetExtension.begin() ) ) {
std::cerr << "yes";
} else {
std::cerr << "no";
}
static std::string const targetExtension(“.txt”);
如果(filename.size()>=targetExtension.size())
&&std::equal(filename.end()-targetExtension.size(),
filename.end(),
targetExtension.begin()){
如果您只需要在Windows上使用它,那么最好的解决方案是使用Win32 API
例如:
string fn = ".txt";
if(PathMatchSpecA(fn.c_str(), "*.txt") {
fprintf(stderr,"yes");
} else {
fprintf(stderr,"no");
}
或者作为一种功能:
BOOL HasTxtFileExtension(LPCSTR filename)
{
return PathMatchSpecA(filename, "*.txt");
}
正如预期的那样,此函数不区分大小写,并正确处理目录包含点但文件不包含点的情况,例如C:\\directory.with.dots\\testtxt
如果您只需要在Windows上工作,最好的解决方案是使用Win32 API
例如:
string fn = ".txt";
if(PathMatchSpecA(fn.c_str(), "*.txt") {
fprintf(stderr,"yes");
} else {
fprintf(stderr,"no");
}
或者作为一种功能:
BOOL HasTxtFileExtension(LPCSTR filename)
{
return PathMatchSpecA(filename, "*.txt");
}
正如预期的那样,此函数不区分大小写,可以正确处理目录包含点但文件不包含点的情况,例如C:\\directory.with.dots\\testtxt
我建议只使用“txt”。它更快,而且您已经比较了点……但请注意查找()
将返回npos
如果文件名不包含任何点,并且由于npos被定义为常数-1,则此代码将向其添加一个,并调用substr(0)
。因此,如文所述,“扩展名”没有点的字符串将是整个文件名…原因似乎不是此代码有意表达的。我建议只使用“txt”。它更快,而且您已经比较了点…但是请注意find_last_of()
将返回npos
如果文件名不包含任何点,并且由于npos被定义为常数-1,则此代码将向其添加一个,并调用substr(0)
。因此,如文所述,“扩展名”没有点的字符串将是整个文件名…原因似乎不是此代码有意表达的。我尝试使用boost Library时无法工作,主要是因为它的所有源代码和我以及构建源代码都不起作用:(如果有人为mingw预先构建了二进制文件,我会卖给你,你可以按照这个指南,但它不能保证与mingw一起工作,请看开头我在尝试时无法让boost Library工作,主要是因为它的所有源代码和我以及构建源代码都不起作用:(如果有人为mingw预先构建了二进制文件,我会卖给你,你可以遵循本指南,但不能保证与mingw一起工作。请参阅开头。你用cout和cin标记了它,然后使用fprintf
到标准错误。仅供参考,标准错误有一个iostream类,因此你可以执行cerr顺便说一句,你不检查文件扩展名。)“在文件中”但“在文件名中”。以编程方式访问文件扩展名通常是对文件名的滥用。用户应该能够将任何他们想要的内容作为文件名,例如notes.txt.old,这将阻止您的程序工作。请告诉您的操作系统供应商停止以这种方式滥用文件名,并开始以合理的方式存储文件类型元数据。您已将其标记为cout然后使用fprintf
检查标准错误。仅供参考,标准错误有一个iostream类,因此您可以执行cerr顺便说一句,您不检查文件扩展名“在文件中”而是“在文件名中”.以编程方式访问文件扩展名通常是对文件名的滥用。用户应该能够将任何他们想要的内容作为文件名,例如notes.txt.old,这将阻止您的程序工作。告诉您的操作系统供应商停止以这种方式滥用文件名,并开始以合理的方式存储文件类型元数据。