[C言語]プログラム実行時に入出力ファイルを指定する方法(2)

こんにちは。Takuya.B(@TB_IQ)です。

以前、C言語におけるファイル入出力で、プログラム実行時に入力ファイル・出力ファイルを指定する方法を紹介しました。

ソースファイルを編集する際にいちいち入出力のファイル名を変更せずに、一度プログラムをコンパイル/実行すると自由にファイル名を指定できるのは便利ですが、これだけでは少々面倒臭さが残ります。

そこで、今日はもう少し楽にC言語のプログラム実行時に入出力ファイルをする方法をご紹介します!

スポンサーリンク

ちょっとした問題点

それでは私が実際に感じた面倒くさい点について紹介します。

問題点1:拡張子まで入力するのが面倒くさい

//プログラム実行時にファイル指定する方法
 
  FILE *fp;
  char input[256];
 
  printf("入力するデータ名を入力して下さい>>>");
   scanf("%s",&input);
   if((fp=fopen(("%s",input),"r"))==NULL){
      fprintf(stderr,"ファイルが読み込めません\n");   //エラー処理
      exit(-1);                    //エラー処理
    }

以前の記事のコードは上のものになります。ここで7行目のscanf関数でファイル名を指定しているわけですが、これでは拡張子まで入力する必要があります。

私の場合、ほとんどが同一の拡張子(.tblなど)なので、毎回拡張子を入力するのが少々面倒くさいです。

問題点2:複数のファイルを指定するのが面倒くさい

例えば、data1.tbl, data2.tbl, data3.tbl という3つのファイルを指定したい場合、毎回入力するのは面倒です。連番なのだから、どうせならfor文でグルグル回したいというのが本音です。

 

これらの問題点を解消するためには、scanffopenだけでは対処できません。そこでsprintf関数を付け足す必要があります。詳しく見てみましょう。

sprintf関数を使って自在にファイル名を出力

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
     FILE *fp;
     char input[256], filename[256]; //新たにfilenameを追加

     printf("入力するデータ名を入力して下さい>>");
     scanf("%s", &input);                  //ここまでは同じ

     sprintf(filename, "%s.tbl", input);  

     if((fp=fopen(("%s", filename),"r"))==NULL){
     printf("FILE NOT INCLUDE\n");    //エラー処理
     exit(-1);                        //エラー処理
     }

     fclose(fp);
     return 0;
}

ここで12行目のsprintf関数が今回追加したものです。

例えばdata1.tblというファイルを指定したい場合の流れは

  1. scanfでinput[256]に data1 を入力する
  2. sprintfで入力したdata1に拡張子.tblをくっつけてfilename[256]に格納
  3. filename[256]に格納したファイル名を持つデータをfopenする

となります。入力した名前を持つファイルをオープンするのではなく、sprintfというワンクッションを挟みます。こうすることで、例えば連番のファイルなども簡単に処理することができます。

連番を扱う場合

連番を持つファイルを出力する場合は以下のコードのようになります。

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
     FILE *fp;
     char input[256], filename[256]; //新たにfilenameを追加
          int i;

     printf("入力するデータ名を入力して下さい>>");
     scanf("%s", &input);                  //ここまでは同じ

          for(i=1; i<=3; i++){
     sprintf(filename, "%s%d.tbl", input, i);  

     if((fp=fopen(("%s", filename),"r"))==NULL){
     printf("FILE NOT INCLUDE\n");    //エラー処理
     exit(-1);                        //エラー処理
     }

     fclose(fp);
     }
     return 0;
}

単純にfor文でグルグル回しているだけです。sprintfはprintf関数と似ており、複数の変数を扱うことが可能です。従って、文字列だけでなく整数型の変数も扱って1つの文字型にすることもできます。

上の例で言えば、scanfで”data”という文字列を変数inputに格納し、整数型変数iを1から3までカウントアップしているので、結果としてdata1.tbl, data2.tbl, data3.tblの3つのファイルを読み込むことができます。

スポンサーリンク

まとめ

拡張子まで入力するのが面倒くさかったり、連番付きのファイルは作れないのかと悩んでいましたが、調べてみるとsprintfを使うことで解決できるとわかりました。

sprintf関数を使うと色々と応用ができそうです。是非、参考にしてみてください!

About me
Takuya.B
大学院博士課程まで進学して宇宙系の研究に取り組むも中退。現在は本業iOSエンジニアとして勤務する傍ら、副業として個人ブロガー向けのWordPressカスタマイズサービスに取り組んでいる。

WordPressテーマ『MIKA』製作者でありブログサポートコミュニティ『Tea Room』運営。