- ベストアンサー
ファイル名を
あるフォルダ内に、実行ファイルと入力ファイルがあり、プログラムを実行すると、 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; }
- みんなの回答 (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] ); } 注:インデントに全角空白を用いています。
その他の回答 (2)
- x415f484f
- ベストアンサー率71% (57/80)
BCC32 は手元にないので動作確認はしておりませんけど、DOS 窓というか コマンドプロンプトで実行なさたいならこれでいかがでしょうか? http://msdn.microsoft.com/library/ja/vclib/html/_crt__find.2c_._wfind_Functions.asp
お礼
ご回答有難うございます。 参考URLを拝見いたしました。#1のご回答のようにFindFirstFile,FindNextFile,FindCloseでもできるし、違う方法もあるのですね。
- Oh-Orange
- ベストアンサー率63% (854/1345)
★アドバイス ・ファイルを検索したいなら次のリンクから探しましょう。 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→『フォルダを検索する』
お礼
ご回答ありがとうございます。 FindFirstFileというのは初めて知りました。 教えていただいたURLはこれからも参考になります。
お礼
教えていただいたソースコードを追加して以下のように変更しました。 とても助かりました。ありがとうございました。 #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++; } } // 続きは補足へ
補足
// お礼の続き 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; }