ショッピングモール  


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

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

 詳しくはこちら



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

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


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

No.3078

オプション指定
投稿者---hina(2004/11/26 17:12:00)


オプションで-sと指定すると_A_SYSTEMの属性のファイルを表示せず他の属性のファイルを表示させたいのですが何かよい方法は無いでしょうか。
開発環境はWindows2000sp4/VC++6.0sp6/Consol-Appです。
struct kouzoutai
{
time_t time_write;
_fsize_t size;
char name[254];
unsigned attrib;
struct kouzoutai *next;
};

struct kouzoutai *alloc(char *x);
void print(struct kouzoutai *f);
void kaihou(struct kouzoutai *ptr );

int main(int argc,char *argv[])
{
struct kouzoutai *d_file;
int i;
char kakunou[260];
d_file = NULL;

for(i=1;i<argc;i++)
{
if(argv[i][0]=='-')
{
switch(argv[i][1])
{
case's':
}
}
else
{
strncpy(kakunou,argv[i],259);
}
}

d_file = alloc(kakunou);
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 *root;
struct kouzoutai *itr;
struct kouzoutai *b_file;
long hFind;

root=NULL;
itr=NULL;
b_file=NULL;
hFind=0;

if((hFind = _findfirst(x, & e_file)) == -1L)
{
puts("一致するファイルが見つかりません。");
return NULL;
}

do{

b_file = (struct kouzoutai*)malloc(sizeof(struct kouzoutai));
if(b_file == NULL)
{
puts("メモリが確保できませんでした。");
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);

b_file->next = NULL;

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

return root;
}

void print(struct kouzoutai *f)
{
puts("作成年月日 作成時刻 サイズ ファイル名 属性");
while( f )
{
struct tm* c_time = localtime(&(f->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->size, f->name);
if(f->attrib & _A_ARCH)
printf("A");
else
printf("-");
if(f->attrib & _A_HIDDEN)
printf("H");
else
printf("-");
if(f->attrib & _A_RDONLY)
printf("R");
else
printf("-");
if(f->attrib & _A_SUBDIR)
printf("D");
else
printf("-");
if(f->attrib & _A_SYSTEM)
{
printf("S\n");
continue;
}
else
printf("-\n");
f = f->next;
}
}

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





この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:オプション指定 3079 nop 2004/11/26 17:22:22


No.3079

Re:オプション指定
投稿者---nop(2004/11/26 17:22:22)


>オプションで-sと指定すると_A_SYSTEMの属性のファイルを表示せず他の属性のファイルを表示させたいのですが何かよい方法は無いでしょうか。
>開発環境はWindows2000sp4/VC++6.0sp6/Consol-Appです。

まず、オプションを考えずに、

・_A_SYSTEMの属性のファイルを表示させない

と言う事は可能ですか?
それが出来ないのでれば、
まずはそこから始めましょう。

また、オプションの処理がわからない場合には、
コマンドライン引数の処理を勉強しましょう。


# 何がわからないのかを明示しないと、
# ただの丸投げと受け取られますよ?


この投稿にコメントする

削除パスワード

No.3080

Re:オプション指定
投稿者---hina(2004/11/26 17:31:53)


>>オプションで-sと指定すると_A_SYSTEMの属性のファイルを表示せず他の属性のファイルを表示させたいのですが何かよい方法は無いでしょうか。
>>開発環境はWindows2000sp4/VC++6.0sp6/Consol-Appです。
>
>まず、オプションを考えずに、
>
>・_A_SYSTEMの属性のファイルを表示させない
>
>と言う事は可能ですか?
はい、argv[1]番目にc:\*.*と渡せば_A_SYSTEMの属性のファイルを表示させずに他の属性のファイルを表示させる事は可能です。
>それが出来ないのでれば、
>まずはそこから始めましょう。
>
>また、オプションの処理がわからない場合には、
>コマンドライン引数の処理を勉強しましょう。
>
>
># 何がわからないのかを明示しないと、
># ただの丸投げと受け取られますよ?
-sと指定する事によってprint()関数を呼び出せればと思うのですがその方法が思いつきません。


この投稿にコメントする

削除パスワード

No.3081

Re:オプション指定
投稿者---nop(2004/11/26 17:46:11)


>-sと指定する事によってprint()関数を呼び出せればと思うのですがその方法が思いつきません。

基本的に、オプションの処理は、
プログラムの始めに行い、
そのオプションが指定されたかどうか、
と言うフラグを引数などにすればわかりやすいかと思います。

最も、コマンドライン引数の処理は、
マン−マシンインターフェース(人間とのI/F)を
どの様に設計するか?によって処理方法が変わると思います。

まずは、呼び出す時のオプション・引数の仕様を固めるのが先決でしょう。


この投稿にコメントする

削除パスワード

No.3082

Re:オプション指定
投稿者---hina(2004/11/26 17:57:07)


すみません、ぜんぜん違うのを貼り付けてしまいました。
以下のプログラムで、argv[1]番目に-sと渡してやれば、_A_SYSTEMの属性のファイルを表示させずに他の属性のファイルを表示させたいのですが、アドバイスお願いします。
開発環境はWindows2000sp4/VC++6.0sp6/Console-Appです。
struct kouzoutai          
{
    time_t time_write;
    _fsize_t size;
    char name[254];
    unsigned attrib;
    struct kouzoutai *next;
};

struct kouzoutai *alloc(char *x);   
void print(struct kouzoutai *f);    
void kaihou(struct kouzoutai *ptr );

int main(int argc,char *argv[])
{
    struct kouzoutai *d_file;
    int i;
    char kakunou[260];
    d_file = NULL;
    
    for(i=1;i<argc;i++)
    {
        if(argv[i][0]=='-')
        {
            switch(argv[i][1])
            {
                case's':
            }
        }
        else
        {
            strncpy(kakunou,argv[i],259);
        }
    }
    
    d_file = alloc(kakunou);
    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 *root;   
    struct kouzoutai *itr;    
    struct kouzoutai *b_file; 
    long        hFind;     

    root=NULL;
    itr=NULL;
    b_file=NULL;
    hFind=0;
    
    if((hFind = _findfirst(x, & e_file)) == -1L)
    {
        puts("一致するファイルが見つかりません。");
        return NULL;
    }

    do{
              
        b_file = (struct kouzoutai*)malloc(sizeof(struct kouzoutai));
        if(b_file == NULL)                      
        {
            puts("メモリが確保できませんでした。");
            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);
        
        b_file->next = NULL;                     
        
        if( root == NULL )                       
        {
            root = b_file;
            itr = b_file;
        }
        else                                     
        {
            itr->next = b_file;
            itr = itr->next;
        }
    }while( _findnext(hFind, &e_file) == 0 );    
    _findclose(hFind);                           

    return root;
}

void print(struct kouzoutai *f)     
{
    struct tm *c_time;
   puts("作成年月日 作成時刻     サイズ           ファイル名      属性");
    while( f )
    {
        
        if(f->attrib & _A_SYSTEM)
        {
            f=f->next;
            continue;
        }
        
        c_time = localtime(&(f->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->size, f->name);
        if(f->attrib & _A_ARCH)
            printf("A");
        else
            printf("-");
        if(f->attrib & _A_HIDDEN)
            printf("H");
        else
            printf("-");
        if(f->attrib & _A_RDONLY)
            printf("R");
        else
            printf("-");
        if(f->attrib & _A_SUBDIR)
            printf("D\n");
        else
            printf("-\n");
        f = f->next;
    }
}

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



この投稿にコメントする

削除パスワード

No.3083

Re:オプション指定
投稿者---monkey(2004/11/26 19:22:03)


// このようなことをなさりたいのではないかと推測。

#include <stdio.h>
#include <string.h>

int main( int argc, char* argv[] )
{
    typedef enum{ S, DEF } Option;
    Option option = DEF;

    char kakunou[ 260 ];
    int i;

    if( argc < 2 ){
        puts( "error" );
        return 1;
    }
    for( i = 1; i < argc; i++ ){
        if( argv[i][0] == '-' ){
            if( strcmp( argv[i], "-s" ) == 0 && argc > 2 ){
                option = S;
                strcpy( kakunou, argv[ ++i ] );
                break;
            }
            else{
                puts( "error" );
                return 1;
            }
        }
        else{
            strcpy( kakunou, argv[ i ] );
            break;
        }
    }

    switch( option )
    {
    case S:
        // 他の属性のファイルを表示させる処理
        break;
    default:
        // _A_SYSTEMの属性のファイルを表示させる処理
    }

    return 0;
}



この投稿にコメントする

削除パスワード

No.3089

Re:オプション指定
投稿者---Hermit(2004/11/27 10:51:42)


ちょっと遊んでみる。

#include <stdio.h>
#include <io.h>

unsigned setAttrib(opt) char *opt; {
  unsigned ret = 0;
  while (*++opt) {
    switch(*opt) {
      case 'a': case 'A':
        ret |= _A_ARCH;
        break;
      case 'h': case 'H':
        ret |= _A_HIDDEN;
        break;
      case 'r': case 'R':
        ret |= _A_RDONLY;
        break;
      case 'd': case 'D':
        ret |= _A_SUBDIR;
        break;
      case 's': case 'S':
        ret |= _A_SYSTEM;
        break;
      default:
        ;
    }
  }
  return ret;
}

main(argc, argv) int argc; char **argv; {
  int i;
  unsigned attrib = 0;
  char *searchFiles = "";
  long hFind;
  struct _finddata_t buff;

  for ( i = 1; i < argc; i++) {
    if (argv[i][0] == '-')
      attrib |= setAttrib(argv[i]);
    else
      searchFiles = argv[i];
  }
  if ((hFind = _findfirst(searchFiles,&buff)) == -1L) {
    puts("一致するファイルが見つかりません。");
  } else {
    do {
      if (buff.attrib & attrib)
        continue;
      printf("%c%c%c%c%c %10u %-30s %s",
        buff.attrib & _A_ARCH ? 'A':'-',
        buff.attrib & _A_HIDDEN ? 'H':'-',
        buff.attrib & _A_RDONLY ? 'R':'-',
        buff.attrib & _A_SUBDIR ? 'D':'-',
        buff.attrib & _A_SYSTEM ? 'S':'-',
        buff.size,
        buff.name,
        asctime(localtime(&buff.time_write)));
    } while (_findnext(hFind,&buff) == 0);
  }
  exit(0);
}



この投稿にコメントする

削除パスワード

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




掲示板提供:Real Integrity