• ベストアンサー

ファイル名を

あるフォルダ内に、実行ファイルと入力ファイルがあり、プログラムを実行すると、 1. 実行ファイルと同じフォルダ内にあるファイル名を文字型配列に格納する。 2. さらに拡張子が.txtのファイルをさがし、一覧を表示する。 3. 一覧から入力するファイルを選択する。 という動作をするプログラムを作成していますが、上記「1」の方法が分かりません。 下のソースは、既にファイル名を文字型配列に格納した後(「2」と「3」の動作)のものです。 「1」はどのようなソースコードにすればできるのでしょうか。 大変お手数ですが、ご存知の方教えてください。よろしくお願いします。 OS: Windows2000, コンパイラ: Borland C++ 5.5.1 for Win32 #include <stdio.h> #include <stdlib.h> #define num_files 4 #define max_words 10 int main(void){ int i,j,k,check[num_files],num_candidate,select_no; char file_name[num_files][max_words]={"aaa.txt","bbbb.csv","ccc.txt","ddd.txt"}; char candidate[num_files][max_words],txt[]="txt",infile[max_words]; printf("フォルダ内のファイル一覧\n"); for(i=0;i<num_files;i++){ printf("%s\n",file_name[i]); } printf("\n"); printf("拡張子 *.txt のファイル一覧\n"); for(i=0;i<num_files;i++){ check[i]=0; for(j=0;j<max_words;j++){ if(file_name[i][j]=='.'){ if(file_name[i][j+1]==txt[0] && file_name[i][j+2]==txt[1] && file_name[i][j+3]==txt[2] && file_name[i][j+4]=='\0'){ check[i]++; } } } } num_candidate=0; for(i=0;i<num_files;i++){ if(check[i] != 0){ for(j=0;j<max_words;j++){ candidate[num_candidate][j]=file_name[i][j]; if(file_name[i][j] == '\0'){ break; } } num_candidate++; } } for(i=0;i<num_candidate;i++){ printf("%2d. %s\n",i+1,candidate[i]); } printf("\n"); printf("入力ファイルの番号を選択してください: "); scanf("%d",&select_no); if(select_no<1 || select_no>num_candidate){ printf("入力した数字が不適合です。\n"); exit(1); } for(i=0;i<max_words;i++){ infile[i]=candidate[select_no-1][i]; if(candidate[select_no-1][i] == '\0') { break; } } printf("%s を選択しました。\n",infile); return 0; }

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

  • ベストアンサー
  • yama5140
  • ベストアンサー率54% (136/250)
回答No.3

>OS: Windows2000, コンパイラ: Borland C++ 5.5.1 for Win32 という環境で作って(☆)みました( C++ 5.82 ですと下記の実行ファイル容量が2倍強に )。 >あるフォルダ内に、実行ファイルと入力ファイルがあり、 ★ソースでは "*.*" の部分です。これが別のフォルダであったり、  サブのフォルダであればちょっと面倒、・・(再帰呼出しとか)。 ☆ C++Builder ヘルプの使用例を、ちょこっと改良しただけ。 #include <dir.h> #include <stdio.h> void main() {  int iDone, i, iCnt = 0;  char cStore[512][260]; // [260]dir.h 参照  struct ffblk sInfo;  iDone = findfirst( "*.*", &sInfo, ( FA_NORMAL | FA_RDONLY | FA_ARCH ) );  while( ! iDone ){   strcpy( cStore[iCnt++], sInfo.ff_name );   iDone = findnext( &sInfo );  }  for( i = 0; i < iCnt; i++ ) printf( "%3d %s\n", i, cStore[i] ); } 注:インデントに全角空白を用いています。

eliteyoshi
質問者

お礼

教えていただいたソースコードを追加して以下のように変更しました。 とても助かりました。ありがとうございました。 #include <stdio.h> #include <stdlib.h> #include <dir.h> #define max_files 512 #define max_words 260 int main(void){ int iDone,iCnt = 0; char cStore[max_files][max_words]; struct ffblk sInfo; int i,j,k,check[max_files],count_check,num_candidate,select_no; char candidate[max_files][max_words],txt[]="txt",infile[max_words]; iDone = findfirst( "*.*", &sInfo, ( FA_NORMAL | FA_RDONLY | FA_ARCH ) ); while( ! iDone ){ strcpy( cStore[iCnt++], sInfo.ff_name ); iDone = findnext( &sInfo ); } printf("%d %d\n",iDone,iCnt); printf("フォルダ内のファイル一覧\n"); for( i = 0; i < iCnt; i++ ){ printf( "%3d. %s\n", i, cStore[i] ); } printf("\n"); printf("拡張子 *.txt のファイル一覧\n"); for(i=0;i<iCnt;i++){ check[i]=0; j=0; while(cStore[i][j] != '\0'){ if(cStore[i][j]=='.'){ if(cStore[i][j+1]==txt[0] && cStore[i][j+2]==txt[1] && cStore[i][j+3]==txt[2] && cStore[i][j+4]=='\0'){ check[i]++; } } j++; } } // 続きは補足へ

eliteyoshi
質問者

補足

// お礼の続き count_check=0; for(i=0;i<iCnt;i++){ if(check[i] != 0){ count_check++; } } if(count_check==0){ printf("*.txtファイルがありません。\n"); exit(1); } num_candidate=0; for(i=0;i<iCnt;i++){ if(check[i] != 0){ for(j=0;j<max_words;j++){ candidate[num_candidate][j]=cStore[i][j]; if(cStore[i][j] == '\0'){ break; } } num_candidate++; } } for(i=0;i<num_candidate;i++){ printf("%3d. %s\n",i+1,candidate[i]); } printf("\n"); printf("入力ファイルの番号を選択してください: "); scanf("%d",&select_no); if(select_no<1 || select_no>num_candidate){ printf("入力した数字が不適合です。\n"); exit(1); } for(i=0;i<max_words;i++){ infile[i]=candidate[select_no-1][i]; if(candidate[select_no-1][i] == '\0'){ break; } } printf("%s を選択しました。\n",infile); return 0; }

その他の回答 (2)

  • x415f484f
  • ベストアンサー率71% (57/80)
回答No.2

BCC32 は手元にないので動作確認はしておりませんけど、DOS 窓というか コマンドプロンプトで実行なさたいならこれでいかがでしょうか? http://msdn.microsoft.com/library/ja/vclib/html/_crt__find.2c_._wfind_Functions.asp

eliteyoshi
質問者

お礼

ご回答有難うございます。 参考URLを拝見いたしました。#1のご回答のようにFindFirstFile,FindNextFile,FindCloseでもできるし、違う方法もあるのですね。

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.1

★アドバイス ・ファイルを検索したいなら次のリンクから探しましょう。  http://oshiete1.goo.ne.jp/qa3745278.html→『FindFirstFileについて』  http://shoppers-jp.com/tech/sdk016.html→『ファイルの列挙処理』  http://www14.big.or.jp/~ken1/tech/tech5.html→『指定したディレクトリ以下のファイルを列挙』  http://www.ne.jp/asahi/nagoya/ahomaro/builder/cpb-014.html→『フォルダを検索する』

eliteyoshi
質問者

お礼

ご回答ありがとうございます。 FindFirstFileというのは初めて知りました。 教えていただいたURLはこれからも参考になります。

関連するQ&A