0

ディレクトリを取り、ディレクトリ内のファイルをループするプログラムをcで作成しようとしています。ファイルに対して何らかの処理を行い、新しい名前で再保存する予定です。ディレクトリの内容を取得するために dirent 構造体を使用しましたが、dirent から FILE * を取得しようとすると問題が発生します。

 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行目を削除すると、セグメンテーション違反になります。(また、そのサイズは、ファイルのバイト、文字、または単語のサイズに近くありません。) 助けてください、ありがとう!

:)

編集: #includes を含めました

4

1 に答える 1

2

3 つの問題があります。

  1. argc引数を指定しない場合、0 ではなく 1 です。したがって、次のように変更しmain()ます。

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

  2. 失敗したfopen()場合は、とにかくファイルを処理しようとします。elseまたはcontinueループを追加します。

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

  3. メモリ リークがあります。あなたは を割り当てbuf1ますが、決してfree()それをしません。

于 2012-11-14T07:40:47.437 に答える