コマンドラインから引数を渡してみよう
コマンドラインから引数を渡してテキストファイルの中身を読み込んでみる
引数を受け取る準備
int main(int argc, char *argv[]){ //argument count, argument vector
retrun 0;
}
main()に引数を設定すると、コマンドの数を整数で、内容を文字列で返してくれる。
コマンド:
bash
./mycat file1.txt file2.txt
下のようになります。
argv[0] = "./mycat"
argv[1] = "file1.txt"
argv[2] = "file2.txt"
argv[3] = NULL // 終端マーカー
argc = 3
エラー対策
if (argc < 2) {
printf("Usage: %s filename\n", argv[0]);
return 1;
}
ファイルの指定がない場合、使いかたを表示するようにします。
%sは文字列を差し込むという意味。
argv[0]に、入力された実行ファイルの名前が格納されている。
ファイルの中身を読み込む
FILE *fp = fopen(argv[1], "r");
if (!fp) {
perror(argv[1]);
return 1;
}
char buf[256];
while (fgets(buf, sizeof(buf), fp)) {
printf("%s", buf);
}
fclose(fp);
FILE *fp = fopen(argv[1], "r");
FILEは、C標準ライブラリの構造体です。
FILEには
・ディスクリプタ番号
・バッファ
・現在位置
を入れて返します。
fopen()はFILEの情報を参照してファイルの内容を取得します。
if (!fp) {
perror(argv[1]);
return 1;
}
エラー処理
char buf[256];
while (fgets(buf, sizeof(buf), fp)) {
printf("%s", buf);
}
文字列を受け取るため、buf[256]を用意します。
256は1行ごとに受け取れる文字数の指定です。この場合255文字で、終端に\0が入ります。
fget(内容を入れるバッファ, 最大サイズ, ファイルポインタ){}
という感じで使います。
for(int i = 1; i < argc; i++){
FILE *fp = fopen(argv[i], "r");
if (!fp) {
perror(argv[i]);
continue;
}
char buf[256];
while (fgets(buf, sizeof(buf), fp)) {
printf("%s", buf);
}
fclose(fp);
}
複数ファイルが入力された場合の処理。
特に難しいところはないです。
fclose();は忘れずに。
cat.c
#include <stdio.h>
int main(int argc, char *argv[]) {
if (argc < 2) {
printf("Usage: %s filename\n", argv[0]);
return 1;
}
for(int i = 1; i < argc; i++){
FILE *fp = fopen(argv[i], "r");
if (!fp) {
perror(argv[i]);
continue;
}
char buf[256];
while (fgets(buf, sizeof(buf), fp)) {
printf("%s", buf);
}
fclose(fp);
}
return 0;
}
全体です。
次に実行してみます。
テキストファイルを用意します。
test.txt
Hello, Rasberry Pi!
From Ryuya.
bash
gcc ../cat.c -o cat
sudo ./cat test.txt
実行結果
bash
Hello, Rasberry Pi!
From Ryuya.
指定したファイルがなかった時
bash
test.txt: No such file or directory