1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

C言語とLinuxのお勉強

1
Posted at

コマンドラインから引数を渡してみよう

コマンドラインから引数を渡してテキストファイルの中身を読み込んでみる

引数を受け取る準備

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
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?