2

私は 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 ステートメントは何でしょうか?

4

6 に答える 6

3

ファイル拡張子が.hであるかどうかを確認するだけです。

const char *ext = strrchr (entry->d_name, '.');     
if ((ext != NULL) && (!strcmp (ext+1, "h"))) {
     // header file
}

もちろん、これはすべてのヘッダー ファイルに拡張子があることを前提としていることに注意してください。これは.h正しい場合とそうでない場合があります。C 標準では、ヘッダー ファイルに.h拡張子が必要であるとは規定されていません。

于 2012-09-05T06:36:03.200 に答える
2

dirent構造にはファイルの名前が含まれているため、またはd_nameで終わるなど、何らかのパターンに従っているかどうかを確認したいと思います。.h.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()生活を楽にする関数を検討することもできます。

int endsWith (char *str, char *end) {
    size_t slen = strlen (str);
    size_t elen = strlen (end);
    if (slen < elen)
        return 0;
    return (strcmp (&(str[slen-elen]), end) == 0);
}
:
if (endsWith (entry->d_name, ".h"))   header_count++;
if (endsWith (entry->d_name, ".hpp")) header_count++;
于 2012-09-05T06:34:52.623 に答える
2

ファイル拡張子をチェックするよりもはるかに優れた方法がいくつかあります。

ウィキペディアには、ここここに良い記事があります。後者のアイデアはマジック ナンバー データベースと呼ばれます。これは基本的に、ファイルに blah シーケンスが含まれている場合、データベースにリストされている一致するタイプであることを意味します。数には場所の制限がある場合とない場合があります。この方法 IMO は、ファイル拡張子の検出よりも遅いですが、より正確です。

しかし、繰り返しになりますが、ヘッダーかどうかを確認するのと同じくらい簡単なことの場合、これは少しやり過ぎかもしれません XD

于 2012-09-05T06:58:53.907 に答える
1

最後の数文字がヘッダー ファイル拡張子 .h、.hpp などのいずれかであるかどうかを確認できます。ファイルの名前にはdirent構造体を使用します。d_name

または、「file」コマンドを実行して、その結果を解析することもできます。

于 2012-09-05T06:33:52.813 に答える
0

おそらく、ファイル拡張子を確認したいだけでしょう。direntを使用して、 を見たいと思うでしょうd_name

于 2012-09-05T06:35:12.920 に答える
0

それはあなた次第です。

最も簡単な方法は、ファイル名 (d_name) を調べて、".h" や ".hpp" などで終わっているかどうかを確認することです。

一方、ファイルを開いて実際に読み取って有効な c/c++ であるかどうかを確認するのは、はるかに複雑になります...コンパイラを介して実行できますが、すべてのヘッダーが単独で機能するわけではないため、そのテスト多くの偽陰性を与えます。

于 2012-09-05T06:35:29.800 に答える