C言語の基礎 - インターフェイス
コマンドライン引数を利用してプログラムにデータを渡す
コマンドライン引数は、プログラムの実行時に渡される引数のことである。
例えば、コマンドライン引数を利用できるa.outというプログラムにコマンドライン引数を渡すには、以下のように入力する。
./a.out 引数1 引数2 ... 引数n
コマンドライン引数を受け取るプログラムを記述する場合は、main関数に引数を用意する。
一般に引数は以下の2通りの方法で記述する。
int main(int argc, char *argv[])
int main(int argc, char **argv)
以下の例では、コマンドライン引数を利用して、簡易版mvコマンドを作成している。
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
/* コマンドライン引数の数のチェック */
if ( argc != 3 )
{
fprintf(stderr, "引数の数が不正です.\n");
exit(EXIT_FAILURE);
}
/* rename 関数でファイルを移動(リネーム)する */
if ( rename(argv[1], argv[2]) == 0 )
{
printf("%sを%sに変更しました.\n", argv[1], argv[2]);
}
else
{
fprintf(stderr, "%sの変更に失敗しました.\n", argv[1]);
}
return EXIT_SUCCESS;
}
リダイレクションを利用してファイルからデータを読み込む
scanf関数やgetchar関数などの標準入力からデータを読み取る関数は、キーボードからデータを入力するが、
リダイレクションを使用することでファイルからデータを入力することができる。
リダイレクションを使用してファイルからデータを読み込むには、コマンドラインから以下のコマンドを実行する。
プログラム名 < ファイル名
以下の例では、リダイレクションを使用して標準入力としてファイルからデータを入力している。
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
char s[N] = {'\0'};
fgets(s, N, stdin);
printf("%s\n", s);
return EXIT_SUCCESS;
}
リダイレクションを利用してファイルにデータを書き込む
printf関数やputchar関数等の標準出力にデータを出力する関数は、ディスプレイにデータを出力するが、
リダイレクションを使用することでファイルにデータを出力することができる。
リダイレクションを利用してファイルにデータを書き込むには、コマンドラインから状況に応じて以下のコマンドを実行する。
コマンド | 説明 |
---|---|
プログラム名 > ファイル名 | 標準出力への出力をファイルに上書き |
プログラム名 >> ファイル名 | 標準出力への出力をファイルに追記 |
プログラム名 > 出力ファイル名 2>&1 または プログラム名 > 出力ファイル名 &2>1 |
標準出力と標準エラー出力への出力をファイルに上書き |
プログラム名 2> ファイル名 | 標準エラー出力への出力をファイルに上書き |
Linuxの場合は、上記のコマンドに加えて、以下のコマンドが使用できる。(ただし、シェルによっては対応していない場合がある)
コマンド | 説明 |
---|---|
プログラム名 &> ファイル名 | 標準出力と標準エラー出力への出力をファイルに上書き |
プログラム名 >& ファイル名 | 標準出力と標準エラー出力への出力をファイルに上書き |
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
char *s = "Snoopy!";
printf("%s\n", s);
return EXIT_SUCCESS;
}
パイプを利用してプログラム間でデータを渡す
標準出力から出力されたデータはパイプを使用することにより、別のプログラムの標準入力へ入力することができる。
パイプを利用してプログラム間でデータを渡すには、以下のようにコマンドを実行する。
プログラム1の標準出力からプログラム2の標準入力へデータを渡します.
プログラム1 | プログラム2
出力側(output.c)
以下の出力側のプログラムを用意して、output.outという名前でコンパイルする。
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
char s[N] = {'\0'};
printf("%s\n", "Snoopy!");
return EXIT_SUCCESS;
}
入力側(input.c)
以下の入力側のプログラムを用意して、input.outという名前でコンパイルする。
#include <stdio.h>
#include <stdlib.h>
#define N 256
int main(void)
{
char s[N] = {'\0'};
fgets(s, N - 1, stdin);
/* scanf("%255s", s) */ /* こちらの記述でもよい */
printf("%s\n", s);
return EXIT_SUCCESS;
}
他のプログラムを実行する
他のプログラムを実行するには、stdlib.hのsystem関数を使用する。
system関数は、コマンドプロセッサへ引数が指す文字列を渡す関数である。system関数によって渡された文字列は、コマンドプロセッサによって実行される。
呼び出す側のプログラム(exec.c)
以下の呼び出す側のプログラムをexec.outという名前でコンパイルする。
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
char program[] = "./print.out";
int result;
/* 他プログラムを実行する */
result = system(program);
if ( result == EXIT_SUCCESS )
{
puts("正常に実行されました.");
}
else
{
puts("正常に実行されませんでした.");
}
return EXIT_SUCCESS;
}
呼び出される側のプログラム(print.c)
以下の呼び出される側のプログラムをprint.outという名前でコンパイルする。
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
printf("Snoopy\n");
return EXIT_SUCCESS;
}