我正在编写我的第一个C程序,尽管我来自C ++背景。
我需要遍历文件目录并检查文件是否是头文件,然后返回计数。
我的代码如下,我认为它非常简陋:
static int CountHeaders( const char* dirname ) {
int header_count = 0;
DIR* dir_ptr;
struct dirent* entry;
dir_ptr = opendir( dirname );
while( ( entry = readdir( dir_ptr ) ) )
{
if ( entry->d_type == DT_REG )
{
//second if statement to verify the file is a header file should be???
++header_count;
}
}
closedir( dir_ptr );
return header_count;
}
检查文件是否为标题会有什么好的if语句?
答案 0 :(得分:3)
只需检查文件扩展名是否为.h
,例如:
const char *ext = strrchr (entry->d_name, '.');
if ((ext != NULL) && (!strcmp (ext+1, "h"))) {
// header file
}
当然,请注意,这假设您的所有标头文件都有.h
扩展名,这可能是也可能不是,C标准并未规定标头文件必须具有.h
扩展名。< / p>
答案 1 :(得分:2)
每个dirent
结构都有一个包含文件名称的d_name
,所以我想看看是否有一些模式,如.h
或{{1 }}
这将是代码:
.hpp
当然,这不会让真正邪恶的人接触到他们的可执行文件int len = strlen (entry->d_name);
if ((len >= 2) && strcmp (&(entry->d_name[len - 2]), ".h") == 0))
header_count++;
if ((len >= 4) && strcmp (&(entry->d_name[len - 4]), ".hpp") == 0))
header_count++;
,但是他们可能只是少数人。
您甚至可以考虑使用ha_ha_fooled_you.hpp
功能,让您的生活更轻松:
endsWith()
答案 2 :(得分:2)
有一些比检查文件扩展名更好的方法。
维基百科有一篇好文章here和here。后一种想法被称为幻数数据库,这实际上意味着如果文件包含blah序列,那么它就是数据库中列出的匹配类型。有时这个号码对地点有限制,有时也没有。这种方法虽然比文件扩展名检测慢,但IMO更准确。
但话又说回来,对于像查看它的标题一样简单的事情,这可能有点矫枉过正XD
答案 3 :(得分:1)
您可以检查最后几个字符是否是标题文件扩展名之一,.h,.hpp等。使用dirent
结构d_name
作为文件名。
或者,您可以运行'file'命令并解析其结果。
答案 4 :(得分:0)
您可能只想查看文件扩展名。使用dirent,您需要查看d_name
。
答案 5 :(得分:0)
这取决于你。
最简单的方法是查看文件名(d_name),并检查它是否以“.h”或“.hpp”等结尾。
另一方面,打开文件并实际读取它以查看它是否是有效的c / c ++将会更复杂......你可以通过编译器运行它,但并不是每个标题都可以自行运行,所以测试会给你很多假阴性。