• ベストアンサー

ファイル名を

あるフォルダ内に、実行ファイルと入力ファイルがあり、プログラムを実行すると、 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

  • C言語のファイル操作についての質問です

    #include <stdio.h> #include<process.h> int main(void) { FILE *fp; int a[200], i, j, cnt, max, max_i; fp = fopen("data.txt", "r"); if (fp == NULL) { printf("file cannot open.\n"); exit(1); } for(i = 0; i < 200 && fscanf(fp, "%d", &a[i]) == 1; ++ i) ; fclose(fp); for(max = max_i = j = 0; j < i; ++ j){ int k; for(cnt = 0, k = j + 1; k < i; ++ k) cnt += (a[j] == a[k]); if(cnt > max) max = cnt; max_i = j; } printf("%d\n", a[max_i]); return 0; } これは「data.txt」というファイルから最頻値を探し出し、その値を表示するプログラムです。 しかし、このプログラムだと最頻値が1つしか表示できないので、 最頻値が複数ある場合でも、すべての最頻値の値を表示させるようなプログラムに書き換えてほしいです。 よろしくお願いします。 例)data.txt 30000 100 150 30000 30000 100 4320 100 出力↓ 30000 100

  • ファイル名の変換

    たびたびですいませんが、まったくの初心者で全然わからずお手上げ状態で困っています。よろしくお願いします 「以下のプログラムで入力ファイル名をID(ref|~~|の~~の部分のことです、例えばNP_000166.2.txtなど)の形に変更しなさい」といった作業をしたいのです。 #include <stdio.h> #include <string.h> #include <stdlib.h> #define MAX_LEN 256 int main(int argc, char *argv[]) { FILE *rfp; FILE *wfp; int i, score; double evalue; char id[MAX_LEN], name[MAX_LEN], fname[MAX_LEN]; if (argc != 2){ printf("エラー:プログラム名 入力ファイル\n"); return(0); } if((rfp = fopen(argv[1], "r")) == NULL) { printf("入力ファイルが存在しません。\n"); return (EXIT_FAILURE); } i = 0; while (fscanf(rfp,"%s\t%s\t%d\t%f", id, name, &score, &evalue) != EOF){ sprintf(fname,"files/%d.txt",i); if ((wfp =fopen(fname,"w")) == NULL) { printf("出力ファイルが存在しません\n"); return (EXIT_FAILURE); } fprintf(wfp,"%s\t%s\t%d\t%f", id, name, score, evalue); fclose(wfp); i++; } fclose(rfp); return (EXIT_SUCCESS); }

  • C言語のプログラムに関する質問です。

    C言語初心者で困っています。 SNをサンプリング数、FNをファイル数として、テキストファイルの1行目のデータ(kari[0])と2行目のデータ(kari[1])をそれぞれCH1、CH2に読み込むような以下のようなプログラムがあります。 ------------------------------------------ //読込みファイル名の設定// for(j=1;j<FN+1;j++){ sprintf(file_name,"%s%d%s",file,j,".txt"); printf("%d%s\n",j,file_name); if ((fp = fopen(file_name, "r")) == NULL){ printf("Error: Can't open file; %s\n", file_name); } //データの読込み// for(i=0;i<SN;i++){ fscanf(fp,"%lf,%lf\n",&kari[0],&kari[1]); ch1[i]=kari[0]; ch2[i]=kari[1]; } fclose(fp);       ・       ・       ・ fclose(fp); } ---------------------------------------------- しかし、テキストファイルの初めの3行には不必要な文字列が存在するため、4行目から読み込むように設定したいのですが、やり方がよく分かりません。 どのようにプログラムを書き換えれば良いか、教えていただけると助かります。 よろしくお願いします。

  • ファイル出力について

    ファイルの出力について質問させてください。 #include <stdio.h> #include <stdlib.h> #include <time.h> #include <math.h> #define NUM 50 /*構造体宣言*/ struct Students{ int N; /*学籍番号*/ int A; /*科目Aの点数*/ int B; /*科目Bの点数*/ int C; /*科目Cの点数*/ int sum; /*3科目の合計*/ double ave; double dev; }; /*平均の関数*/ double Average(struct Students tmp) { return(double)(tmp.A+tmp.B+tmp.C)/3.0; } /*偏差値の関数*/ double Deviation(struct Students k,double l,double m) { return(double)(NUM+10*(k.ave-l)/m); } int main(void){ struct Students std[NUM]; /*構造型配列*/ int j=0,i,N,A,B,scannum; double csum=0,sdev=0,cave; /*csum:クラスの総合点、sdev:標準偏差値、cave:クラスの一科目あたりの平均*/ FILE*file; /*ファイルのポインタを用意*/ srand((unsigned)time(NULL)); /*乱数の初期化*/ file=fopen("Data.txt","r"); /*Dataファイルのオープン*/ /*ファイルのオープンチェック*/ if(file==NULL){ fprintf(stderr,"cannnot open file 'Data.txt'\n"); exit(1); } /*Studentsにデータを格納*/ for(i=0;i<NUM;i++){ scannum=fscanf(file,"%d%d%d",&N,&A,&B); /*ファイルが読み込めたかチェック if(scannum!=1){ fprintf(stderr,"cannnot read file 'Data.txt'\n"); exit(1); } */ std[i].N=N; std[i].A=A; std[i].B=B; std[i].C=70+(int)(rand()/(RAND_MAX+1.0)*31); std[i].sum=std[i].A+std[i].B+std[i].C; std[i].ave=Average(std[i]); csum=csum+std[i].sum; }fclose(file); /*標準偏差計算*/ cave=csum/150.0; for(i=0;i<NUM;i++){ sdev=sdev+(std[i].sum-cave)*(std[i].sum-cave); } sdev=sqrt(sdev/NUM); /*偏差値の計算,最高偏差値の出力*/ for(i=0;i<NUM;i++){ std[i].dev=Deviation(std[i],cave,sdev); if(std[i].dev > std[j].dev){ std[j]=std[i]; } printf("学籍番号:%d.\n",std[i].N); printf("科目A:%d.\n",std[i].A); printf("科目B:%d.\n",std[i].B); printf("科目C:%d.\n",std[i].C); printf("平均点:%lf.\n",std[i].ave); printf("偏差値は:%lf.\n",std[i].dev); } /*results.txtに書き込み if((file=fopen("results.txt","w"))==NULL){ printf("cannnot open\n"); return 1; } fprintf(file,"%d,%d,%d,%d,%lf,%lf",std[j].N,std[j].A,std[j].B,std[j].C,std[j].ave,std[j].dev); fclose(file); */ return 0; } このプログラムを実行させてみるとdata.txtの一番最初の学生番号のみ 表示されません。そのためファイルの読み込みのエラー確認を入れると ストップしてしまう状態です。学生番号は101~150なんですが実行結果 が102~150で表示されます。学生番号は変数Nに対応してるのでそこを 考えてみたのですがどこが悪いのか 発見できません。アドバイスを お願いします。

  • 最大値を求める

    3つの整数を入力して、最大値を求めるプログラムを作りたいのですが、整数を入力するところまでは うまくいくのですが、結果が、255、と出てしまいます。どこがおかしいのかが解かりません。 どなたか教えていただけませんか? 宜しくお願いします。 #include <stdio.h> int main(void) { int num[3]; int max, i, j; puts("三つの整数を入力してください"); for(i = 0; i < 3; ++i) { printf("整数%d:", (i + 1)); scanf("%d", &num[i]); } max = num[0]; for(j = 0; j < 3; ++j) { if(max < num[j]) { max = num[j]; } } printf("最大値は%dです。\n", max); return 0; }

  • 大量のファイルを読み込み、その各ファイルの中の最大値と最小値の出力の仕方

    各ファイルの名前はinput_0.txtからinput_4.txtまであるとします。これらのファイルには(1)ナンバー(2)身長(3)体重がスペースをはさんで入力されています。 例:input_0.txt 1 172.3 65.3 2 164.3 54.6 3 176.4 55.4 4 170.2 70.4 5 167.4 63.8 この例では3番目の176.4が最大値として認識し2番目の164.3を最小値として出力させたいのですが、うまくいきません。プログラムを以下のように作りました。どこがいけないでしょうか?ご教授の方よろしくお願いします。 FILE *fpr,*fpw; int no[N],i,j,max_j,min_j; char fname[30]; float height[N],weight[N],max=0,min=0; for(i=0;i<4;i++) //file題名用ループ { sprintf(fname,"input_%d.txt",i); if((fpr=fopen(fname,"r"))==NULL) {puts("file open error!!");return 0;} for(j=0;j<5;j++){ //ファイル内容用ループ while((fscanf(fpr,"%d%f%f",&no[j],&height[j],&weight[j]))!=EOF) if(height[j]>max){ max=height[j];max_j=j; printf("number=%d__height=%.2f__weight=%.2f\n",no[max_j],max,weight[max_j]); } if(height[j]<min){ min=height[j];min_j=j;} printf("number=%d__height=%.2f__weight=%.2f\n",no[min_j],min,weight[min_j]); } fclose(fpr); }

  • テキストファイルの読み込みについて教えて

    また教えてください test13.txtの中身を1,2,3,4,5,6として、以下をコンパイルスルと、 printf("%d\n",a[0]);のときは 1 と結果がでますが printf("%d\n",a[3]);とすると -858993460などと、わからない数字がでます、どこがおかしのか初心者なのでさっぱりわかりません。 #include <stdio.h> int main(void) { int i; int a[6]; FILE *file; file = fopen("d:\\test\\test13.txt","r"); for(i=0;i<6;i++) fscanf(file,"%d",&a[i]); fclose(file); printf("%d\n",a[3]); return 0; }

  • 行ごとにファイル結合

    下記プログラムは、input1.txtの内容 0 1 2 3 4 5 6 7 8 をファイル入力して、行番号とファイルの内容を表示できるように作成したものです。 このプログラムにinput2.txt 9 10 11 12 13 14 とinput3.txt 15 16 17 をファイル入力し、行ごとに結合して 0 0 1 2 9 10 15 1 3 4 5 11 12 16 2 6 7 8 13 14 17 と表示できるようにしたいのですが、どのようにすればよいのでしょうか。ご存知の方、お手数ですが教えてください。よろしくお願いします。 #include <stdio.h> main(){ int i,j=0,N=0,n,a[100],m=0; FILE *fpi; if((fpi=fopen("input1.txt","r"))==NULL){ fprintf(stderr,"ファイルを開けません。\n"); exit(1); } while(fscanf(fpi,"%d",&a[N])!=EOF && N<100){ N++; } n=N/3; printf("%d",m); for(i=0;i<N;i++){ printf(" %2d",a[i]); j++; if(j==n && m<n-1){ printf("\n"); m++; printf("%d",m); j=0; } } fclose(fpi); }

  • なんらかの原因でtxtにデータを入力できない

    こんにちは。 C言語初心者です。 まずこのようなデータを用意しました。 kus1.txt 89 65 37 44 51 30 20 10 そして、このようなプログラムをし、ビルトしました。 #include <stdio.h> #define NUM 8 int main(void) { FILE *fp; int kusa[NUM]; int max,min; int i,k; fp = fopen("kus1.txt","r"); if(fp == NULL){ printf("ファイルオープン失敗\n"); return 1; } for(i=0; i<NUM; i++){ fscanf(fp, "%d", &kusa[i]); } max = kusa[0]; min = kusa[0]; for(k=0; k<NUM; k++){ if(max < kusa[k]) max = kusa[k]; if(min > kusa[k]) min = kusa[k]; printf("NO.%-5d%d\n", k+1, kusa[k]); } printf("最高は%d。\n", max); printf("最低は%d。\n", min); fclose(fp); return 0; } その後、コマンドプロンプトでこれを実行したところ、 ファイルオープン失敗 とでてきました。つまりなんらかの原因で失敗しました。 どうしたら成功できるのでしょうか。教えてください。

  • C言語 セグメンテーション違反

    最大値検索法のプログラムソースを書きましたが、 実行すると、セグメンテーション違反となってしまいます。 どこがおかしいのでしょうか? 分かる方、教えてください。 宜しくお願いします。 swapのソース #include <stdio.h> void swap(int *px,int *py); int main (void) { FILE *fp; if ((fp=fopen("file.txt","rt"))==NULL){ printf("File open error.\n"); //ファイルが無い場合のエラー処理// return 0; } int i,a[10]; for(i=0;i<100;i++){ fscanf(fp,"%d,",&a[i]); //ファイルから読み込み処理。// } fclose(fp); //初期データの並びの表示// for(i=0;i<10;i++) printf("[%d]=%d\n",i,a[i]); /*1.ソートすべきデータの中で最大のデータを見つけ、 2.そのデータを最後のデータと入れ替える。 最大データは配列のどこにあるのか⇒maxi              その値⇒max とする。*/ //データが10個の場合 int max,maxi,j; max=a[0],maxi=0; for(i = 0;i < 9; i++){ if(a[i + 1] > max){ max = a[i + 1]; maxi = i + 1; } swap(&a[maxi],&a[9-j]); for(j=0;j<9;j++){ printf("%d \n",j); printf("i=%d\n ",i); max=a[0], maxi=0; for(i=0;i<9-j;i++){ //最大値をもつデータ探索;(カウンタ変数) max++; //最大データと探索範囲最後のデータとの入れ替え: int n; n=maxi; maxi=max; max=n; printf("maxi=%d \n ",maxi); printf("i=%d\n ",i); printf("j=%d \n",j); } } if((fp=fopen("file.txt","wt"))==NULL){ printf("File open error.\n"); return 0; } for(i=0;i<100;i++){ fprintf(fp,"%d,",a[i]); } fclose(fp); } sortのソース #include<stdio.h> void swap (int *px,int *py); void swap (int *px,int *py) { int n; n =*px; *px = *py; *py = n; }

専門家に質問してみよう