ショッピングモール  


【掲示板ご利用上の注意】

 ※題名は具体的に!
 ※学校の課題の丸投げ禁止!
 ※ソースの添付は「HTML変換ツール」で字下げ!
 ※返信の引用は最小限に!
 ※環境(OSとコンパイラ)や症状は具体的に詳しく!
 ※マルチポスト(多重投稿)は謹んで!

 詳しくはこちら



 本当はこんなに大きく書きたくはないのですが、なかなか守っていただけなくて…。
 守ってくださいね。お願いします。(by管理人)

C言語ソース⇒HTML形式ツール   掲示板1こちら


管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    記事検索    ログ    タグ一覧

No.3017

次の質問
投稿者---hina(2004/11/22 18:32:31)


findnextで次のファイルを探したいのですが、下記の様にしてもうまくいきませんでした。何かよい方法があればアドバイスお願いいたします。

struct kouzoutai             
{
    time_t time_write;
    _fsize_t size;
    char name[243];
    unsigned attrib;
};

struct kouzoutai *alloc(char *x);
void print(struct kouzoutai *a);
void kaihou(struct kouzoutai *m);

int main(int argc,char *argv[])
{
    struct kouzoutai *d_file;
    int atai;                
    int i;                   

    for(i=0; i<argc; i++)    
    {
        if((atai=strcmp(argv[i],"*.c"))==0)
        {
            break;
        }
    }
    if(atai!=0)              
    {
        printf("ファイルがありません。\n");
        return 1;
    }

    d_file=alloc("*.*");     

    if(d_file==NULL)
    {
        return 1;
    }
    print(d_file);           
    kaihou(d_file);            

    return 0;
}

{
    struct _finddata_t e_file;  
    struct kouzoutai *b_file;   
    long file;
    
    if((file=_findfirst(x,&e_file))==-1L)      
    {
        printf("カレントディレクトリにファイルは存在しません。\n");
        return NULL;
    }
        b_file=(struct kouzoutai *)malloc(sizeof(struct kouzoutai));
        if(b_file==NULL)                                             
        {
            printf("メモリが確保できませんでした。\n");
            return NULL;
        }
        b_file->size=e_file.size;   
        b_file->time_write=e_file.time_write;
        b_file->attrib=e_file.attrib;
        strcpy(b_file->name,e_file.name);

        while(_findnext(file,&e_file)==0)
        {
            b_file=(struct kouzoutai *)malloc(sizeof(struct kouzoutai));
            b_file->size=e_file.size;   
            b_file->time_write=e_file.time_write;
            b_file->attrib=e_file.attrib;
            strcpy(b_file->name,e_file.name);
        }

    
    return b_file;              
}

void print(struct kouzoutai *a) 
{
    struct tm *c_time;          
    c_time=localtime(&(a->time_write));

    printf("%d年",c_time->tm_year+1900);
    printf("%d月",c_time->tm_mon+1);
    printf("%d日",c_time->tm_mday);
    printf("%d時",c_time->tm_hour);
    printf("%d分",c_time->tm_min);
    printf("%d秒",c_time->tm_sec);
    printf(" %10d %10s ",a->size,a->name);

    printf((a->attrib & _A_ARCH )?"      %10" "Y":"N");
    printf((a->attrib & _A_HIDDEN )?"Y":"N");
    printf((a->attrib & _A_NORMAL )?"Y":"N");
    printf((a->attrib & _A_RDONLY )?"Y":"N");
    printf((a->attrib & _A_SUBDIR )?"Y":"N");
    printf((a->attrib & _A_SYSTEM )?"Y\n":"N\n");
}

void kaihou(struct kouzoutai *m)
{
    free(m);                     
}



この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:次の質問 3019 REE 2004/11/22 19:38:31


No.3019

Re:次の質問
投稿者---REE(2004/11/22 19:38:31)


※題名は具体的に!

>findnextで次のファイルを探したいのですが、下記の様にしてもうまくいきませんでした。何かよい方法があればアドバイスお願いいたします。

何を期待していて、どううまく行かなかったのですか?



この投稿にコメントする

削除パスワード

No.3020

Re:次の質問
投稿者---hina(2004/11/22 21:45:25)


申し訳ありません。struct kouzoutaiの中にstruct kouzoutai *nextを書き忘れていました。動的にstruct kouzoutai型構造体のメモリを確保してその先頭アドレスを持っているb_fileからwhile文とfindnextを使ってstruct kouzoutaiの中のstruct kouzoutai *nextを参照し続ければ目的のファイルを探しつづけてそれらを表示する事がしたいのですが。

struct kouzoutai             
{
    time_t time_write;
    _fsize_t size;
    char name[243];
    unsigned attrib;
    struct kouzuotai *next;
};

struct kouzoutai *alloc(char *x);
void print(struct kouzoutai *a);
void kaihou(struct kouzoutai *m);

int main(int argc,char *argv[])
{
    struct kouzoutai *d_file;
    int atai;                
    int i;                   

    for(i=0; i<argc; i++)    
    {
        if((atai=strcmp(argv[i],"*.c"))==0)
        {
            break;
        }
    }
    if(atai!=0)              
    {
        printf("ファイルがありません。\n");
        return 1;
    }

    d_file=alloc("*.c");     

    if(d_file==NULL)
    {
        return 1;
    }
    print(d_file);           
    kaihou(d_file);            

    return 0;
}

struct kouzoutai *alloc(char *x)
{
    struct _finddata_t e_file;  
    struct kouzoutai *b_file;   
    long file;
    
    if((file=_findfirst(x,&e_file))==-1L)      
    {
        printf("カレントディレクトリにファイルは存在しません。\n");
        return NULL;
    }
        b_file=(struct kouzoutai *)malloc(sizeof(struct kouzoutai));
        if(b_file==NULL)                                              
        {
            printf("メモリが確保できませんでした。\n");
            return NULL;
        }
        b_file->size=e_file.size;   
        b_file->time_write=e_file.time_write;
        b_file->attrib=e_file.attrib;
        strcpy(b_file->name,e_file.name);
        
    return b_file;              
}

void print(struct kouzoutai *a) 
{
    struct tm *c_time;          
    c_time=localtime(&(a->time_write));

    printf("%d年",c_time->tm_year+1900);
    printf("%d月",c_time->tm_mon+1);
    printf("%d日",c_time->tm_mday);
    printf("%d時",c_time->tm_hour);
    printf("%d分",c_time->tm_min);
    printf("%d秒",c_time->tm_sec);
    printf(" %10d %10s ",a->size,a->name);

    printf((a->attrib & _A_ARCH )?"      %10" "Y":"N");
    printf((a->attrib & _A_HIDDEN )?"Y":"N");
    printf((a->attrib & _A_NORMAL )?"Y":"N");
    printf((a->attrib & _A_RDONLY )?"Y":"N");
    printf((a->attrib & _A_SUBDIR )?"Y":"N");
    printf((a->attrib & _A_SYSTEM )?"Y\n":"N\n");
}

void kaihou(struct kouzoutai *m)
{
    free(m);                     
}



この投稿にコメントする

削除パスワード

No.3025

Re:次の質問
投稿者---RAPT(2004/11/23 00:13:45)


要は、_findfirst() で見つかったファイル情報を記憶したい、ってこと?


この投稿にコメントする

削除パスワード

No.3027

Re:次の質問
投稿者---RAPT(2004/11/23 00:48:26)


かなり変えました。ま、私だったらこう書く、っつーことで。
Windows2000sp4/VC++6.0sp6/Console-App


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <io.h>
#include <errno.h>


typedef struct FindData_t   FindData;
struct FindData_t{
    // うちの環境では、_finddata_t.nameはchar[260]でした。
    // 環境依存だと面倒なので内包してみました。
    struct _finddata_t  find;
    FindData*           next;
};


FindData *alloc(const char *x)
{
    struct _finddata_t  e_file;
    FindData*   root = NULL;   // 始点
    FindData*   itr = NULL;    // 終点
    FindData*   b_file = NULL; // メモリ確保用
    long        hFind = 0;     // 検索ハンドル

    if((hFind = _findfirst(x, & e_file)) == -1L){
        if( errno == ENOENT ){
            puts("一致するファイルが見つからりません。");
        }else if( errno == EINVAL ){
            puts("無効なファイル名が指定されました。");
        }else{
            puts("ファイルの検索が失敗しました。");
        }
        return NULL;
    }

    do{
        b_file = (FindData*)malloc(sizeof(FindData));
        if(b_file == NULL){
            puts("メモリが確保できませんでした。");
            break;
        }
        memcpy(&b_file->find, &e_file, sizeof(e_file));
        b_file->next = NULL;
        
        if( root == NULL ){
            root = itr = b_file;
        }else{
            itr->next = b_file;
            itr = itr->next;
        }
    }while( _findnext(hFind, &e_file) == 0 );
    _findclose(hFind);

    return root;
}


void print(const FindData *f)
{
    puts("作成年月日 作成時刻     サイズ           ファイル名      属性");
    while( f != NULL ){
        struct tm* c_time = localtime(&f->find.time_write);

        printf("%04d/%02d/%02d ", c_time->tm_year+1900, c_time->tm_mon+1, c_time->tm_mday);
        printf("%02d:%02d:%02d ", c_time->tm_hour, c_time->tm_min, c_time->tm_sec);
        printf("%10d %20s      ", f->find.size, f->find.name);
        printf((f->find.attrib & _A_ARCH   )?"A":"-");
        printf((f->find.attrib & _A_HIDDEN )?"H":"-");
        printf((f->find.attrib & _A_RDONLY )?"R":"-");
        printf((f->find.attrib & _A_SUBDIR )?"D":"-");
        printf((f->find.attrib & _A_SYSTEM )?"S\n":"-\n");

        f = f->next;
    }
}


void kaihou( FindData* ptr )
{
    FindData*   itr;
    while( ptr ){
        itr = ptr;
        ptr = ptr->next;
        free(itr);
        itr = NULL;
    }
}


int main()
{
    FindData*   d_file = NULL;

    d_file = alloc("*.*");
    if(d_file == NULL){
        return 1;
    }

    print(d_file);
    kaihou(d_file);

    return 0;
}



この投稿にコメントする

削除パスワード

No.3029

Re:次の質問
投稿者---hina(2004/11/24 11:26:08)


><pre>かなり変えました。ま、私だったらこう書く、っつーことで。
Windows2000sp4/VC++6.0sp6/Console-App


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <io.h>
#include <errno.h>


typedef struct FindData_t FindData;
struct FindData_t{
<font color="#009900">// うちの環境では、_finddata_t.nameはchar[260]でした。</font>
<font color="#009900">// 環境依存だと面倒なので内包してみました。</font>
struct _finddata_t find;
FindData* next;
};


FindData *alloc(const char *x)
{
struct _finddata_t e_file;
FindData* root = NULL; <font color="#009900">// 始点</font>
FindData* itr = NULL; <font color="#009900">// 終点</font>
FindData* b_file = NULL; <font color="#009900">// メモリ確保用</font>
long hFind = 0; <font color="#009900">// 検索ハンドル</font>

if((hFind = _findfirst(x, & e_file)) == -1L){
if( errno == ENOENT ){
puts(<font color="#0000ff">"一致するファイルが見つからりません。"</font>);
}else if( errno == EINVAL ){
puts(<font color="#0000ff">"無効なファイル名が指定されました。"</font>);
}else{
puts(<font color="#0000ff">"ファイルの検索が失敗しました。"</font>);
}
return NULL;
}

do{
b_file = (FindData*)malloc(sizeof(FindData));
if(b_file == NULL){
puts(<font color="#0000ff">"メモリが確保できませんでした。"</font>);
break;
}
memcpy(&b_file->find, &e_file, sizeof(e_file));
b_file->next = NULL;

if( root == NULL ){
root = itr = b_file;
}else{
itr->next = b_file;
itr = itr->next;
}
}while( _findnext(hFind, &e_file) == 0 );
_findclose(hFind);

return root;
}


void print(const FindData *f)
{
puts(<font color="#0000ff">"作成年月日 作成時刻 サイズ ファイル名 属性"</font>);
while( f != NULL ){
struct tm* c_time = localtime(&f->find.time_write);

printf(<font color="#0000ff">"%04d/%02d/%02d "</font>, c_time->tm_year+1900, c_time->tm_mon+1, c_time->tm_mday);
printf(<font color="#0000ff">"%02d:%02d:%02d "</font>, c_time->tm_hour, c_time->tm_min, c_time->tm_sec);
printf(<font color="#0000ff">"%10d %20s "</font>, f->find.size, f->find.name);
printf((f->find.attrib & _A_ARCH )?<font color="#0000ff">"A":"-"</font>);
printf((f->find.attrib & _A_HIDDEN )?<font color="#0000ff">"H":"-"</font>);
printf((f->find.attrib & _A_RDONLY )?<font color="#0000ff">"R":"-"</font>);
printf((f->find.attrib & _A_SUBDIR )?<font color="#0000ff">"D":"-"</font>);
printf((f->find.attrib & _A_SYSTEM )?<font color="#0000ff">"S\n":"-\n"</font>);

f = f->next;
}
}


void kaihou( FindData* ptr )
{
FindData* itr;
while( ptr ){
itr = ptr;
ptr = ptr->next;
free(itr);
itr = NULL;
}
}


int main()
{
FindData* d_file = NULL;

d_file = alloc(<font color="#0000ff">"*.*"</font>);
if(d_file == NULL){
return 1;
}

print(d_file);
kaihou(d_file);

return 0;
}
</pre>

ありがとうございました。



この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    記事検索    ログ    タグ一覧




掲示板提供:Real Integrity