0

ファイルへのパスを作成する必要があります。私は次のクラスメソッドを持っています:

void Directory::scanDirectory(char *directory) {
    DIR *dirp;
    struct dirent *entry;
    char path[1];

    if(dirp = opendir(directory)) {
        while(entry = readdir(dirp)) {
            if (entry->d_name[0] != '.') {
                strcpy(path, directory);
                strcat(path, "/");
                strcat(path, entry->d_name);
                if (entry->d_type == 8) {
                    // Files
                } else if (entry->d_type == 4) {
                    //scanDirectory(path);
                }
                printf("Name: %s, Type: %d\n", entry->d_name, entry->d_type);
            }
        }
        closedir(dirp);
    }
}

ディレクトリと を連結して、ファイルへのパスを作成する必要がありますentry->d_name。このコードを実行しようとすると、セグメンテーション違反が発生します。私が言えることから、パスを構築する時点でセグメンテーション違反が発生しています。これを行うより良い方法はありますか?

4

5 に答える 5

3

char path[1]パス ( )に 1 バイトしか割り当てていません。作成しているパス全体を実際に保持するのに十分なスペースを割り当てる必要があります。C++ タグを考えると、明らかな可能性は を使用するstd::stringことです。すべてのピースを完全なパスにまとめた後、そのc_str()メンバー関数を使用して、コンテンツに C スタイルの文字列としてアクセスします。

于 2010-10-09T04:57:09.470 に答える
2

Boost.Filesystemを使用しないのはなぜですか?

于 2010-10-09T05:07:29.883 に答える
1

バッファーpathには、パス全体を保持するのに十分なスペースが必要です。現在、1 文字分のスペースしかありません。大きくしてみてください。strcat はスペース自体を割り当てません。そのメモリを手動で管理する必要があります。

より良い方法として、stringの使用を検討することをお勧めします。メモリを気にする必要はなく、+演算子で連結できます。

于 2010-10-09T04:55:48.477 に答える
1

変更char path[1];:

char path[512]; //or whatever value you like.

あなたのコードでは、 path は 1 文字と\0. 明らかにもっと大きなものが必要です.私の知る限り、UNIXではディレクトリ名は最大255文字までなので、私の意見では512で十分です.

于 2010-10-09T04:59:56.333 に答える
1

使用に注意してくださいstrcpy。境界チェックを行わないため、pathのみですがchar[1]、すべてをコピーしようとしますdirectory。それはおそらくあなたのセグのせいです。

文字列を構築する方法に関しては、多くの選択肢があります。これは、C++ 文字列連結効率に関する長い SO 投稿です。

C++ での効率的な文字列連結

stringC++ を使用している場合、組み込みライブラリを+演算子で使用できない理由はありますか? 例えば:

string path;
//...
path += directory;
path += "/";
path += entry->d_name;
//etc.

このクラスを使用すると、効率がわずかに低下する可能性がありますが、バッファ オーバーフローの問題や、発生しているセグメンテーション違反などのメモリ例外を回避するのに役立つという追加の利点があります (これらすべてを回避するstringとは言いませんが、stringあなたの人生をより簡単に)。

C++ でディレクトリ文字列を構築する方法に関する別の以前の SO 投稿もありました。

c++ パスからディレクトリを作成する方法

于 2010-10-09T05:00:05.733 に答える