0

これは私がこれまでに持っているコードです。ルートがどこにあるかを見つけますが、次の行を追加すると:

printf("        name: %s\n", readdir(opendir(cur_spot))->d_name);

それは cur_spot を変更し、それに奇妙な文字を追加します (ファイル名: .~?) は、それが出力するものです..なぜこれが起こっているのですか?

#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <dirent.h>
#include <sys/stat.h>
#include <sys/types.h>

int main(int argc, char *argv[]) {
    struct stat file_stats;
    struct stat parent_stats;
    struct dirent temp_dir;

    char cwd_name[256]; //directory name
    char cur_spot[256]; //current directory spot

    cur_spot[0] = '.';
    stat(cur_spot, &file_stats);
    printf("filename: %s\n", cur_spot);
    printf(" inode: %ld\n", file_stats.st_ino);


    strcat(cur_spot, ".");
    stat(cur_spot, &parent_stats);
    printf("filename: %s\n", cur_spot);
    printf(" inode: %ld\n", parent_stats.st_ino);

    while(file_stats.st_ino != parent_stats.st_ino) {
        printf("not at root yet\n\n");

        stat(cur_spot, &file_stats);
        printf("    current child\n");
        printf("        inode: %ld\n", file_stats.st_ino);
        printf("        name: %s\n", readdir(opendir(cur_spot))->d_name);
        strcat(cur_spot, "/..");
        stat(cur_spot, &parent_stats);
        printf("    current parent\n");
        printf("        inode: %ld\n", parent_stats.st_ino);
    }
        printf("at root\n");


    return 0;
}
4

4 に答える 4

1

これはGCCでうまく機能します:

#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <dirent.h>
#include <sys/stat.h>
#include <sys/types.h>

int main(int argc, char *argv[]) {
    struct stat file_stats;
    struct stat parent_stats;
    struct dirent temp_dir;
    DIR *dirp;

    char cwd_name[256]; //directory name
    char cur_spot[256]; //current directory spot

    strcpy(cur_spot,".");  // <------------ changed
    stat(cur_spot, &file_stats);
    printf("filename: %s\n", cur_spot);
    printf(" inode: %ld\n", file_stats.st_ino);


    strcat(cur_spot, ".");
    stat(cur_spot, &parent_stats);
    printf("filename: %s\n", cur_spot);
    printf(" inode: %ld\n", parent_stats.st_ino);

    while(file_stats.st_ino != parent_stats.st_ino) {
        printf("not at root yet\n\n");

        stat(cur_spot, &file_stats);
        printf("    current child\n");
        printf("        inode: %ld\n", file_stats.st_ino);
        dirp=opendir(cur_spot); // <----------------added
        printf("        name: %s\n", readdir(dirp)->d_name);  // <----changed
        closedir(dirp); // <------------------------added
        strcat(cur_spot, "/..");
        stat(cur_spot, &parent_stats);
        printf("    current parent\n");
        printf("        inode: %ld\n", parent_stats.st_ino);
    }
        printf("at root\n");


    return 0;
}
于 2012-12-07T01:05:47.670 に答える
0

これは最初の質問の範囲を超えているため、最初の回答とは別の回答として追加します。私の最初の回答の下のコメントで述べたように、ディレクトリ内のすべてのファイルのファイル名を出力しようとしている場合は、man ページの読み取りから単に NULL が返される終了条件まで readdir() を呼び出し続けるだけです。価値。ところで、マニュアル ページに または と記載されているREADDIR(2)場合This is not the function you are interested in、本当にやりたいことは、readdir のセクション 3 のマニュアル ページを参照することです。これは、 で取得できますman -s 3 readdir

とにかく、私はあなたが望むと思うことをするために私の最初の答えからコードを改造しました:

#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <dirent.h>
#include <sys/stat.h>
#include <sys/types.h>

int main(int argc, char *argv[]) {
    struct stat file_stats;
    struct stat parent_stats;
    struct dirent temp_dir;
    DIR *dirp;
    struct dirent* dent;

    char cwd_name[256]; //directory name
    char cur_spot[256]; //current directory spot

    strcpy(cur_spot,".");          // <------------- changed
    stat(cur_spot, &file_stats);
    printf("filename: %s\n", cur_spot);
    printf(" inode: %ld\n", file_stats.st_ino);


    strcat(cur_spot, ".");
    stat(cur_spot, &parent_stats);
    printf("filename: %s\n", cur_spot);
    printf(" inode: %ld\n", parent_stats.st_ino);

    while(file_stats.st_ino != parent_stats.st_ino) {
        printf("not at root yet\n\n");

        stat(cur_spot, &file_stats);
        printf("    current child\n");
        printf("        inode: %ld\n", file_stats.st_ino);
        dirp=opendir(cur_spot);    // <------------- added
        do {                       // <------------- NEW
            dent = readdir(dirp);  // <------------- NEW
            if (dent)              // <------------- NEW
                printf("        name: %s\n", dent->d_name);
        } while (dent);            // <------------- NEW
        closedir(dirp);            // <------------- added
        strcat(cur_spot, "/..");
        stat(cur_spot, &parent_stats);
        printf("    current parent\n");
        printf("        inode: %ld\n", parent_stats.st_ino);
    }
        printf("at root\n");


    return 0;
}
于 2012-12-07T15:46:52.367 に答える
0

文字配列の末尾に NULL 文字を追加する必要があります。

違う:

cur_spot[0] = '.';

右:

cur_spot[0] = '.';
cur_spot[1] = '\0';

NULL 文字は文字列を終了します。文字列は、デフォルトで NULL に初期化される場合とされない場合があります。

于 2012-12-07T01:09:50.867 に答える
0

あなたはループでたくさんの「opendir」を実行しますが、「closedir」の痕跡は見られません。罰せられるべきだ…

于 2012-12-07T01:09:51.163 に答える