2012-12-07 19 views
0

這是代碼我到目前爲止,找到根源在哪裏是好的,但是當我添加一行:調用執行opendir和readdir的是改變了我的字符數組

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; 
} 
+0

你不初始化'字符cur_spot [256];',所以第一個'STAT(cur_spot ,&file_stats);'可以統計誰知道什麼。 –

+0

更確切地說,它缺少'cur_spot [1] = 0;'。 –

+0

或用'char cur_spot [256] =「。」;' – Barmar

回答

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; 
} 
+0

真棒這對我也適用。但是,我的印象是,d_name將返回目錄的名稱,但它是打印,.bash_logout或srv(srv是根的位置)。有什麼辦法可以打印出你使用ls或類似的東西時看到的內容嗎? –

+0

@TroyCosentino - 已經有一段時間了,我現在沒有時間更多地研究它,但我認爲你一直在調用readdir(),它會一直給你在每個調用的目錄中的下一個文件。我不記得目錄結束條件是什麼。你有'man'命令嗎? – phonetagger

+0

@TroyCosentino - 查看我的新答案,瞭解我想要的其他更改。 – phonetagger

0

你應該在一個字符數組的末尾添加一個空字符。

錯誤:

cur_spot[0] = '.'; 

右:

空字符結束的字符串。默認情況下,字符串可以或不可以初始化爲NULL。

0

你在循環中做了一堆「opendir」,但我看不到「closedir」的痕跡。你應該受到懲罰......

0

這超出了你最初的問題範圍,所以我把它作爲一個單獨的答案加入我的第一個問題。正如我在我的第一個回答下的評論中所說的那樣,如果您打算在目錄中打印所有文件的文件名,那麼您只需要繼續調用readdir(),直到出現一些終止條件,從讀取手冊頁開始,它只是一個NULL返回值。順便說一句,如果你的手冊頁說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; 
}