• ベストアンサー

入力ファイルのデフォルトの設定

下のソースは入力ファイルの内容が例えば、 1 2 3 4 5 6 7 8 の時にその内容を出力するものです。 入力ファイル名がinput.datの場合、プログラム実行後にinput.datと入力し、Enterを押します。 このプログラムにinput.datをデフォルトとし、空Enterで入力を実行できるようにしたいと考えています。 入力ファイル名がinput.datでない場合は従来通りファイル名を入力してEnterを押すようにします。 この場合、どのようにソースを変更すればよいでしょうか。お手数ですが、教えてください。よろしくお願いします。 #include <stdio.h> #include <stdlib.h> int main(){ int i,N=0,data[10]; char ifile[20]; FILE *fp; printf("input file name: "); scanf("%s",ifile); if((fp=fopen(ifile,"r"))==NULL){ fprintf(stderr,"input file error\n"); exit(1); } while(fscanf(fp,"%d",&data[N])!=EOF && N<10){ N++; } printf("Total Number of Data = %d\n",N); for(i=0;i<N;i++){ printf("%d\n",data[i]); } fclose(fp); return 0; }

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

  • ベストアンサー
回答No.2

scanf() の %s は空白文字を読み飛ばすためおそらく Enter の入力も読み飛ばされて引き続き入力待ちになるのではないかと思います。 ということで、(scanf()でもフォーマットを工夫すれば出来ないことはありませんが) 私は fgets() をおすすめします。 printf("input file name: "); の直後の scanf() の代わりに下記のようにして下さい。 fflush(stdout); if (fgets(ifile, sizeof(ifile), stdin)) {  ifile[strlen(ifile) - 1] = '\0';  if (ifile[0] == '\0')   strcpy(ifile, "input.dat"); } else {  exit(1); } 最初の fflush() は念のために入れています。OSや端末の環境やC言語のライブラリによっては printf() の最後に \n がない場合にバッファに溜まるだけで出力されないことがあるのでこれで強制的に出力させます。 fgets() が NULL 以外を返した場合は正常に入力できた場合で、最後の文字を削除していますが、これは '\n' が入っているためです。 あと、fgets() が NULL を返す場合に exit(1); でプログラムが終了しますが、これは EOF が入力された場合の処理です。(UNIX系OSならデフォルトでは Ctrl+D。MS-DOSまたはWindowsのMS-DOSプロンプトまたはコマンドプロンプトなら Ctrl+Z)。

eliteyoshi
質問者

お礼

ご回答ありがとうございます。 下記のようにソースを変更したらできました。 さらに2と入力することにより、input2.datをファイル入力するという内容も付け加えたのですが、これでよいでしょうか?何度も申し訳ありませんが、よろしくお願いします。 #include <stdio.h> #include <stdlib.h> #include <string.h> int main(){ int i,N=0,data[10]; char ifile[20]; FILE *fp; printf("input file name(input.dat): "); fflush(stdout); if(fgets(ifile,sizeof(ifile),stdin)){ ifile[strlen(ifile)-1]='\0'; if(ifile[0]=='\0'){ strcpy(ifile,"input.dat"); } else if(ifile[0]=='2'){ strcpy(ifile,"input2.dat"); } } else{ exit(1); } printf("\n"); printf("input file name is %s .\n",ifile); if((fp=fopen(ifile,"r"))==NULL){ fprintf(stderr,"input file error\n"); exit(1); } while(fscanf(fp,"%d",&data[N])!=EOF && N<10){ N++; } printf("Total Number of Data = %d\n",N); for(i=0;i<N;i++){ printf("%d\n",data[i]); } fclose(fp); return 0; }

その他の回答 (3)

  • gimmick
  • ベストアンサー率49% (134/270)
回答No.4

>else if(ifile[0]=='2'){ >strcpy(ifile,"input2.dat"); >} これだと、入力の1文字目が2の場合にinput2.datが使用されます。 else if(strcmp(ifile, "2") == 0){ strcpy(ifile,"input2.dat"); } のようにしてください。

eliteyoshi
質問者

お礼

何度もご回答ありがとうございました。 ソース変更しました。

  • gimmick
  • ベストアンサー率49% (134/270)
回答No.3

ANo.2の方のおっしゃるとおり、scanf()では改行は読み飛ばされるようです。ANo.1の回答は無視してください。

eliteyoshi
質問者

お礼

ご回答ありがとうございます。 #2のお礼で空Enterでinput.datを入力、2+Enterでinput2.datを入力、それ以外はキー入力という内容にしたのですが、これでよいでしょうか? 何度も申し訳ありませんが、よろしくお願いします。

  • gimmick
  • ベストアンサー率49% (134/270)
回答No.1

最も単純だと思われる方法です。 ------------------------------------------ /*略*/ scanf("%s",ifile); /*ここを追加*/ if (ifile[0] == '\0') {   strcpy(ifile, "input.dat"); } if((fp=fopen(ifile,"r"))==NULL){ /*略*/

関連するQ&A