身につくC言語20回目 コマンドライン引数をつかってファイルの入出力

19回目までは、hello.txtなどあらかじめ決められたファイルを作成したり読み込んでいたりしました。

 

次はgoodbye.txtを開きたいなと思ったとき、いちいちプログラムを開いて変更して保存しなおさなければなりません。

 

めんどくさいですよね。

 

そこで、今回は、扱うファイルを自分で決める事ができるようにしたいと思います。

 

コマンドライン引数を利用したプログラム

まずは細かいことを考えずにこれを入力してみてください。


#include<stdio.h>
int main(int kazu,char *youso[])
{
	int i;
	printf("%d\n",kazu);
	for(i=0;i<kazu;i++)
	{
		printf("%s\n",youso[i]);
	}
	return 0;
}

いままでと大きく違っているのは、main関数に引数があるということです。

 

まずはint kazuについて説明していきましょう。

 

これは、うけとる要素の数です。

 

ここでは1となっていると思います。

 

char *youso[]というのは実際の要素です。

 

ここでは、あなたの作ったそのcファイルのパスが要素になっているはずです。

 

これが基本の形です。

 

youso配列に要素を加えていくことで動的にファイルを変更することができます。

 

コマンドプロンプトをつかう

youso配列に要素を追加していくにはコマンドプロンプトを利用していきます。

 

まずは、windowsなら左下の検索欄に「コマンドプロンプト」と入力して開きましょう。

 

次に先ほど作成したプログラムのある位置にパスを移動させます。

 

例えば初期位置が


D:

で、D:\puroguramu\myc\komando.cがファイルパスなら
※先ほど作成したプログラムはkomando.cとします。

 


cd D:\puroguramu\myc

と入力し、エンターをおします。

 

cdというのはチェンジディレクトリといいます。

 

エンターをおしたら、komando.exeと入力します。すると先ほどの実行画面がでてきたはずです。

 

注意してほしいのはkomando.cとするのではなく、exeとすることです。(いまいちピンとこない人はkomandoだけでもいいです。)

 


コマンドプロンプトで実行ができたら、さらに要素を増やしてみましょう。

 

要素をスペースを開けると区切ることができます。

 

例えば、komando.exe hello goodbyeと入力すると、要素は「komando.exe」「hello」「goodbye」と3つになるので、kazuの値は3となります。

 

コマンドラインを利用したファイルへの出力

今回は「作成するファイル名」の一つを追加します。

受け渡される要素は「作成したプログラムのパス」と「作成するファイル名」の2つです。

 

ということはkazuの値は2となります。


#include<stdio.h>
int main(int kazu,char *youso[])
{
	FILE *fp;
	int i;
	if(kazu!=2)
	{
		printf("パラメータの数が合いません\n");
		return 1;
	}
	fp=fopen(youso[1],"w");
	if(fp==NULL)
	{
		printf("ファイルが開けません。\n");
		return 1;
	}
	
	printf("%d\n",kazu);
	for(i=0;i<kazu;i++)
	{
		printf("%s\n",youso[i]);
	}
	
	fprintf(fp,"hello\n");
	
	fclose(fp);
	
	
	return 0;
}

これで一度c言語側で実行しましょう。

 

するとパラメータの数が違います。と出力されるはずです。

 

これはif文で kazu!=2としているためです。

 

注意してほしいのは、プログラムを変更したら一度実行するということです。

 

Ctrl+sで保存しても、exeファイルは変更されませんので、一度実行をしなければなりません。

次は、コマンドプロンプトから実行してみましょう。 このように入力します。

 


D:○○○\komando hello.txt

○○はプログラムがあるファイルまでのパスです。

 

komandoはファイルの名前です。

 

hello.txtは作成したいファイルの名前です。

 

この2つが引数となります。

 

エンターをおすと同じ階層にtxtファイルが作成されるはずです。

 

これで完了です。

 

まとめ

たまに、fp=fopen(“youso[1]”,”w”);と書いて、あれ?実行できない!となってしまう人もいるようです。

 

正しくはfp=fopen(youso[1],”w”);です。

 

コマンドラインからの入出力はあまり使う機会がないかもしれませんが、覚えておいて損はないでしょう。