C言語 コマンドラインを使って引数を渡す
ファイルのコピーソースを使って、コマンドラインから実行(ファイル名&コピー元ファイル名&コピー先ファイル名)を指定し関数に渡して、ファイルコピー処理させる方法を説明させて頂きたいと思います。
※処理方法としましては[ファイルの書き込み]の内容と同じです。 メモ帳等で任意のファイルを用意します(例:comand.txt)中身は何でも結構です。
ABCD efghi ファイル作成は前回説明させて頂いた[一行毎にファイルを出力]でも作成出来ます。
以下のサンプルで説明する【 fopen 】及びエラー処理に付いて
※ファイルポインタ 【 FILE *fi 】とした場合
※2、【 “任意のファイル名” 】の部分で、変数を使う場合はダブルクウォートは不要です。
例char ss[80]とした場合 【 fi = fopen (ss,”r”) 】(読み込み用に開く場合)【 fi = fopen(ss,”w”) 】(書き込み用に開く場合)
if ((fi=fopen (“任意のファイル名”,”r”)) == NULL ){
printf(“ファイルをオープンできません\n”); exit(1); } /*任意の実行文*/ |
上記の内容を分解したソースです。
fi=fopen(“任意のファイル名”,”r”);
if(fi==NULL)exit(1); /*任意の実行文*/ fclose(file); |
※読み込み用”r”、出力用”w”、追記用”a”に開く場合でもそれぞれ処理は同じになります。
サンプル 【 if (argc != 3) 】はコマンドから入力された引数をチェックしています。
#include <stdio.h>
#include <stdlib.h> int main(int argc, char *argv[ ]) { FILE *fi, *fiout; char ss[256]; if (argc != 3){ printf(“入力された引数が異なります\n”); exit(1); } if ((fi=fopen (argv[1],”r”)) == NULL ){ printf(“ファイルをオープンできません\n”); exit(1); } if ((fiout=fopen (argv[2],”w”)) == NULL){ printf(“ファイルをオープンできません\n”); exit(1); } while(fgets(ss, 256, fi) !=NULL){ fputs(ss, fiout); } fclose(fi); fclose(fiout); return 0; } |
解説
コマンドラインから引数を渡す場合の記述【 int main(int argc, char *argv[]) 】としております。
それぞれの引数名は任意のものでOKとの事ですが、一般的には【 argc 】及び【 argv 】を使うのが基本との事です。
ソース全体の解説図の前に、引数チェックのソースに付いて
if (argc != 3){
printf(“入力された引数が異なります\n”); exit(1); } |
コマンドラインから指定された引数が3意外だとエラー文を出力して終了する記述です。
コマンドラインからの入力サンプル↓
※【 comandli 】実行ファイル名 【 comand.txt 】読み込みファイル名 【 comand2.txt 】出力先(コピー先)ファイル名と指定しております。
上記図のように、コマンドラインから入力された文字列はそれぞれの配列に代入されます。
よって引数チェックの際に 指定文字列が不足する場合にはエラー終了となります。
↓エラーサンプル
全体の解説図
【 FILE *fi, *fiout 】ファイルポインタはそれぞれ【 *fi 】読み込み 【 *fiout 】出力 での利用 ループ条件【 while(fgets(ss, 256, fi)==NULL) 】に付いては 【 fgets(ss,256,fi) 】ファイルポインタに代入された値をssに代入して読み込む(ss, fi)としてもいいような気もしますが、用意している文字型変数配列が【 ss[256] 】(文字終端マーク含むので255文字)の為、安全性を確保するのに一行最大(ss,256,fi)とするようです。
上記の実行結果
※comandli はコンパイルした任意の実行ファイル名です。
※comand.txt は任意に用意したテキストファイルです。ファイルが存在しない場合はエラーにて停止します。
※cc.txt は出力先任意のファイル名。存在しない場合は新規作成されます。 出力結果を確認するにはdosコマンド type 任意のテキストファイル名を指定すると内容を確認できます。またメモ帳から直接確認することも出来ます。
コメント