C言語関係掲示板

過去ログ

No.1251 ディレクトリの最後を指したポインタを先頭に戻したい。

[戻る] [ホームページ]
No.2551

ディレクトリの最後を指したポインタを先頭に戻したい。
投稿者---えいこ(2004/08/27 14:26:26)


はじめまして えいこです。

環境はWindows XP, Borland C++ Compiler 5.5です。
初心者です。よろしくお願いします。

.灰泪鵐疋薀ぅ鶲数でディレクトリを指定
∋慊螢妊レクトリ内のファイル数を調べる
G枸鵝淵侫.ぅ詭召鯤歛犬垢襪燭瓩稜枸鵝砲領琉茲魍諒櫃垢
ぅ妊レクトリ内のファイルのファイル名を配列に取得する
という作業をしたいのですが、
一度ディレクトリの最後まで指したポインタを
先頭に戻すにはどうしたらいいのでしょうか?(★★★の部分)
(rewindを使用するとコンパイルエラーになりました。)


#include    <stdio.h>
#include    <dirent.h>

int main(argc,argv)
    int argc;
    char *argv[];
{
    DIR *dir;
    struct dirent *dp;
    
    char path[257];/*指定したディレクトリ名を入れる*/
    int f_count = 0;/*ファイル数カウント用*/
    char (*f)[33];/*ファイル名を保存する配列*/
    int i;/*↑の配列の添え字用*/
        
    if(argc!=2){
        printf("コマンドラインの入力形式が間違っています\n");
        printf("test_readdir02 入力ファイル名\n");
        exit(-1);
    }else{
        /*コマンドライン引数よりディレクトリ名を指定*/
        strcpy(path,argv[1]);
    }
    
    /*ディレクトリを開く*/
    if((dir=opendir(path))==NULL){
        perror("opendir");
        exit(-1);
    }
    /*ファイル数をカウントする*/
    while ((readdir(dir)) != NULL) {
        f_count++;
    }
    printf("f_count=%d\n",f_count); 

    /*★★★ここでポインタを先頭に戻したい★★★*/
    
    /*ファイル名を入れる配列を確保する*/
    f = (char (*)[33])malloc((f_count-2) * 33);
    
    /*ファイル名を配列にコピーする*/
    i=0;
    for(dp=readdir(dir);dp!=NULL;dp=readdir(dir)){
        strcpy(f[i], dp->d_name);
        printf("%s\n",f[i]);
        i++;
    }
    closedir(dir);
    
    /*記憶域を開放*/
    free(f);
    
    return;
    
}





No.2555

Re:ディレクトリの最後を指したポインタを先頭に戻したい。
投稿者---nop(2004/08/27 14:33:09)


>一度ディレクトリの最後まで指したポインタを
>先頭に戻すにはどうしたらいいのでしょうか?(★★★の部分)

一度閉じて、開き直すのが一番手っ取り早いのでは?


No.2556

Re:ディレクトリの最後を指したポインタを先頭に戻したい。
投稿者---Sciggepy(2004/08/27 14:36:38)


>(rewindを使用するとコンパイルエラーになりました。)
rewinddirでは?


No.2557

Re:ディレクトリの最後を指したポインタを先頭に戻したい。
投稿者---tetrapod(2004/08/27 14:38:28)


rewinddir() でいけるでしょう。
が、最初に個数を調べるときと、次にファイル名を取得するときとで、
ファイル数が変わっていたら意味が無いです。
アトミックに1回で操作するようにしたほうがいい。


No.2558

Re:ディレクトリの最後を指したポインタを先頭に戻したい。
投稿者---ぽこ(2004/08/27 14:41:02)


>(rewindを使用するとコンパイルエラーになりました。)
rewinddir()じゃ駄目ですか?


No.2560

rewinddir()で解決しました。ありがとうございます。
投稿者---えいこ(2004/08/27 14:48:56)


はじめは、一回閉じてまた開けていたのですが、
なにか関数があればと自分で探してみて見つからなくて投稿しました。
rewinddir()で解決いたしました。
皆様、早々にご回答くださってありがとうございます。