• ベストアンサー

DIRについて

     DIR *fp; struct dirent *p; fp=opendir(argv[1]); while((p=readdir(fp))!=NULL) といったように、プログラムを組んでいるのですが、 具体的に*fpに入っているもの(指しているもの)は、どのようなものなのでしょうか? *pはdirent構造体を指しているということはわかるのですが、 *fpに関しては、いまいちイメージができないので、 教えていただけないでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • cosmos-kt
  • ベストアンサー率29% (43/147)
回答No.1

opendir関数を調べて見ましょう。 opendirとは、ルートディレクトリ以下のディレクトリ名を入力すると、そのディレクトリへのポインタを出力するとあります。 Unixの場合には、inodeと呼ばれる文字配列が入りますし、MS-DOSや初期のWindowsの場合には、FATやFAT-32から生じる、これまた文字配列が入ります。そんなことですから、もう少し具体化すると、readdirに読み込んでもらうデータ列群を指定するポインタが入るということでもあるのです。これは、逆にwritedirによって出力するためのデータが入っているともいえます。

関連するQ&A

  • UNIXの勉強

    下のようなディレクトリ中のファイルを出力するプログラムを作りました #include <sys/types.h> #include <dirent.h> #include "ourhdr.h" int main(int argc, char *argv[]) { DIR *dp: struct direct *dirp; if (argc != 2) err_quit("a single argument (the directory name) is required"); if ( (dp = opendir(argv[1]) ) == NULL) err_sys("can't open %s", argv[1]); while ( (dirp = readdir(dp) ) !=NULL) printf("%s\n", dirp->d_name); closedir(dp); exit(0); } windowsのcygwinでコンパイラしようとしたのですが、 ourhdr.h : NO such file or directory のように表示されコンパイルできません。どうすれば、コンパイルできるようになるのか教えてください。

  • スレッドセーフな関数readdir_rに関して

    C言語初心者です。 readdirにてディレクトリ検索を実施しようと思ったのですが、 スレッドセーフな関数ではないとのことから、 readdir_rにてプログラミングを行う予定でいます。 しかし、関数を調べてみたところ、パラメータが何をさしているのか、 リターン値は何を返すのか等の情報がどこにも見当たりません。 現在わかっているのは、下記の定義であることのみです。 int readdir_r (DIR *, struct dirent *, struct dirent **) こんなことを聞くのは場違いかもしれませんが、 readdir_rの仕様をご存じの方、もしくは説明が書かれている Webをご存じの方、大変申し訳ございませんが、 ご教授頂けますよう宜しくお願い致します。

  • ディレクトリの判別

    FreeBSD5.4でstat()関数のS_ISDIRを使ってディレクトリかどうかを判別したいのですが、 S_ISDIRでは普通のファイルもディレクトリと認識してしまいます。もしご存知の方がいらっしゃいましたら、何卒ご教授くださいませ。 --------------------------------------------- #include <stdio.h> #include <string.h> #include <sys/types.h> #include <dirent.h> #include <sys/stat.h> #include <stdlib.h> int createFileList(char *directoryName){ DIR *directoryId; struct dirent *directoryPointer; struct stat fi; directoryId=opendir(directoryName); while((directoryPointer=readdir(directoryId))!=NULL){ stat(directoryPointer->d_name,&fi); if (!S_ISDIR(fi.st_mode)) printf("%s\n",directoryPointer->d_name); } closedir(directoryId); return 0; } ---------------------------------------------

  • whileの働きについて

    whileの働きについて教えてください。 構造体をポインタで繋いでおり、以下のようにしてkeyが一致した構造体を削除する場合、 while文が最初にチェックするpは、アドレスの小さい順番からなのか、それともアトランダムなのかが知りたいのですが。 よろしくお願いいたします。 /*** リストからデータを削除 ***/ struct list *del_list( int key, struct list *head ) { struct list *old_p; struct list *p, *p2; p = old_p = head; /* キーのサーチ */ while ( p != NULL ) { 略

  • C言語の構造体についてなんですが。

    struct LIST {     struct Num* number;     struct LIST* next;/* 次の要素へのポインタ */ }*root; struct Num{     int a;     struct Num* next; /* 次の要素へのポインタ */ }*numroot; と構造体を定義したときに、 main(){     struct LIST *p;     for(p = root; p != NULL; p = p->next) ; } とすれば、pの先頭からNULLまでを参照していくことは分かるんですが、pのnumberの先頭からNULLまでの参照方法(プログラムのfor文の記述方法)がイマイチわかりません。つまり、構造体の構造体をどのように参照するかということです。 これを実現したい理由は、構造体内での数の格納を配列(固定長)ではなく可変長で格納したいからです。 分かる方は解答をお願いします。

  • 画像の処理について

    『ppm形式の画像の読み込み』のプログラムを実行したのですが、 エラーがでてうまくいきません。 どこを修正しなければいけないのか、教えてください。 エラーの内容↓ function 'main': main.c:17: 警告: passing argument 1 of 'fopen' makes pointer from integer without a cast main.c: In function 'headerScan': main.c:35: 警告: ポインタと整数との比較を行なっています main.c:36: 警告: ポインタと整数との比較を行なっています main.c:37: 警告: ポインタと整数との比較を行なっています main.c: In function 'dataScan': main.c:44: 警告: ポインタと整数との比較を行なっています プログラム↓ #include <stdio.h> #include <stdlib.h> struct image{ int type; int width; int height; int depth; char *data; }; int main(int argc, char *argv){ FILE *fpin; fpin = fopen("argv[1]", "rb"); struct image *img; headerScan(fpin, img); img->data = (char *)malloc(sizeof(char)*img->width*img->height*3); dataScan(fpin, img); free(img->data); fclose(fpin); return 0; } int headerScan(FILE *fp, struct image *img){ while(fscanf(fp, "P%d", &(img->type)) == NULL) ; while(fscanf(fp, "%d %d", &(img->width), &(img->height)) == NULL) ; while(fscanf(fp, "%d", &(img->depth)) == NULL) ; return 0; } int dataScan(FILE *fp, struct image *img){ int i = 0; while(fscanf(fp, "%c%c%c", &(img->data[i++]), &(img->data[i++]), &(img->data[i++])) != NULL) ; return 0; }

  • readdir()関数について教えて下さい

    参考書を読んでいて解らないところがあったので教えてください。 /////////////////////////////// //イメージディレクトリを開く opendir($ImageDir); while(($ImageFile = readdir()) !== false){ となっているのですが、 readdir()の引数を指定しなくてもちゃんと動くみたいなんですが、 どうしてなのでしょうか? 特に気にしなくてもいいのでしょうか?よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • readdir()で得られるファイル・ディレクトリ情報の順番は?

    Perlプログラムにて、  opendir(DIR, '.');  @dir_list = readdir(DIR);  closedir(DIR); などとすると、そのディレクトリにあるファイルとディレクトリの一覧情報を得ることができますが、この場合、@dir_list にはどのような順番で情報が格納されるのでしょうか? readdir() 関数の仕様が知りたいです。ご存知の方、ぜひ教えてください。

    • ベストアンサー
    • Perl
  • ファイルから読み込んだデータを構造体に格納できますか?

    1レコード19バイトのファイルを 読み込む処理を行っています。 地区名10バイト 県名8バイト 改行1バイト このデータをdouken(構造体)に格納したいのですが >while (fgets(dou,19,fp) != NULL){ で、エラーになってしまいます。 どのようにしたら ファイルから読み込んだデータを 構造体に格納できますか? #include<stdio.h> #include <stdlib.h> struct douken { char tiku[10]; char ken[8]; } main(void){ FILE *fp; struct douken dou[100]; int i; fp = fopen("ex3.fil","rb"); if ( fp == 0 ){ printf("can't open\n"); exit(1); } while (fgets(dou,19,fp) != NULL){ ・ ・ ・

  • UNIXの"find"コマンド同等のプログラム作成について

    お世話になっております。 現在UNIXの"-type f"オプションのついた"find"コマンドと同等のプログラムをC言語で作ろうとしています。 つまりディレクトリ内のファイル(サブディレクトリ内のファイル含む、ディレクトリは除外)を全てフルパスで表示するプログラムです。 現在下記の関数を作成したのですがうまく動いてくれません。 どなたかご教授いただけないでしょうか。 【問題】 プログラム内の(**)前後で"dir1"が変更される。 (**)前:"/ディレクトリA/" (**)後:"/ディレクトリA/ディレクトリA内のファイル1" 本当は"dir1"には:"/ディレクトリA/"のままであってほしいです。 "strcat"コマンドの仕様が影響しているのでしょうか。 int _find(char dir1[] , int k ,int l , int m ) { DIR *dir ; struct dirent *dp ; struct stat statbuf ; char txt[1000] ; if ( m == 0 ) l++ ; if ( (dir = opendir(dir1)) == NULL ){ printf("%s",dir1) ; perror("opendir") ; exit(1) ; } for( dp=readdir(dir) ; dp != NULL ; dp=readdir(dir) ){ if ( strcmp(dp->d_name,".") != 0 && strcmp(dp->d_name,"..") != 0 ){ /* ROOT_DIR名-にファイル名を付け加えて、フルパスにする */ strcpy( temp[k][l] , dir1) ; strcat( temp[k][l] , "/" ) ; strcat( temp[k][l] , dp->d_name ) ;  (**) stat( temp[k][l] , &statbuf ) ; if(S_ISDIR(statbuf.st_mode)){ l=_find(temp[k][l],k,l,1) ; }else{ sort[k][l]=temp[k][l] ; printf("temp[%d][%d]=%s\n",k,l,sort[k][l]); printf( "dir5=%s\n",dir1) ; l++ ; } } } closedir(dir) ; return l ; }

専門家に質問してみよう