2012-11-14 67 views
0

我想在c中編寫一個程序,它需要一個目錄並通過目錄中的文件循環。我打算對這些文件進行一些處理並以新名稱重新保存它們。我使用dirent結構來獲取目錄內容,但是當我嘗試從dirent中獲取FILE *時出現問題。使用dirent通過html文件在c目錄中循環使用dirent

1 #include <unistd.h> 
2 #include <sys/types.h> 
3 #include <dirent.h> 
4 #include <stdio.h> 
5 #include <string.h> 
6 #include <sys/fcntl.h> 
7 #include <stdlib.h> 
8 #include <sys/stat.h> 
9 #include <errno.h> 
13 char parentName[256]; 
14 
15 void listdir(const char *name, int level) 
16 { 
17  DIR *dir; 
18  struct dirent *entry; 
19 
20  if (!(dir = opendir(name))) 
21   return; 
22  if (!(entry = readdir(dir))){ 
23   closedir(dir); 
24   return; 
25  } 
26 
27  do { 
28   if (entry->d_type == DT_DIR) { 
29     printf("Don't give me a directory!!"); 
30   } 
31   else{ 
32     FILE *thisFile; 
33     if(!(thisFile = fopen(entry->d_name, "r"))){ 
34       printf("Error"); 
35     } 
36     struct stat buf0; 
37     fstat(fileno(thisFile), &buf0); 
38     off_t size = buf0.st_size; 
39     printf("size = %d\n",(int) size); 
40     printf("Made it here first"); 
41     char *buf1 = (char*) malloc(101); 
42     printf("Made it here"); 
43     fgets(buf1,100,thisFile); 
55     printf("%s",buf1); 
56   } 
57  } while ((entry = readdir(dir))); 
58  closedir(dir); 
59 } 
60 
61 int main(int argc, char* argv[]) 
62 { 
63   if (argc == 0) listdir(".", 0); 
64   else listdir((char*)argv[1],0); 
65  return 0; 
66 } 

方案產出

大小= 12292
分段錯誤:11

如果我刪除第39行,它只是出現segfaults。 (此外,該大小不接近字節,字符或單詞的文件大小。)請幫助,謝謝!

:)

編輯:包括#包括

+0

你嘗試過使用調試器嗎? –

+0

還請包括包含指令 –

+0

我曾嘗試使用gdb,但我無法讓它告訴我發生了什麼。我對gdb不是很有經驗,試圖在這個項目中獲得一些C的榮譽。 – syzygy

回答

2

我看到三個問題:

  1. argc是1不是0,當你給沒有參數。所以,在main()改變:

    if (argc == 1) listdir(".", 0);

  2. fopen()失敗了,你試着處理文件。無論是添加elsecontinue循環:

    if(!(thisFile = fopen(entry->d_name, "r"))){
    printf("Error");
    continue;
    }

  3. 您有內存泄漏。你分配buf1,但你永遠不會free()它。

+0

1.良好的發現,謝謝 2.也是一個很好的建議,但它從不打印「錯誤」,所以這不是我的問題的根源。 3.另外一個有效的點,我離開它,因爲程序永遠不會到達那裏。 感謝您的幫助 – syzygy

+0

還有一個:有一個'fopen',但沒有'fclose'。 –