関数

[C言語] コマンドライン引数で処理するファイルを指定する方法

C言語では、プログラムの実行時にコマンドライン引数を使用してファイルを指定することができます。

これにより、プログラムは指定されたファイルを開いて処理を行うことが可能です。

コマンドライン引数は、main関数の引数としてint argcchar *argv[]を使用して受け取ります。

argcは引数の数を示し、argvは引数の配列を指します。

通常、argv[1]にファイル名が格納されているため、これを用いてfopen関数でファイルを開くことができます。

コマンドライン引数でファイルを指定する方法

C言語では、プログラムの実行時にコマンドライン引数を利用して、外部からデータを受け取ることができます。

ここでは、コマンドライン引数を用いてファイルを指定し、そのファイルを処理する方法について解説します。

ファイル名をコマンドライン引数で受け取る

コマンドライン引数は、main関数の引数として渡されます。

argcは引数の数を表し、argvは引数の文字列を格納した配列です。

以下のサンプルコードでは、ファイル名をコマンドライン引数として受け取ります。

#include <stdio.h>
int main(int argc, char *argv[]) {
    // 引数の数を確認
    if (argc < 2) {
        printf("ファイル名を指定してください。\n");
        return 1;
    }
    // ファイル名を表示
    printf("指定されたファイル名: %s\n", argv[1]);
    return 0;
}
$ ./program sample.txt
指定されたファイル名: sample.txt

このプログラムは、コマンドライン引数としてファイル名を受け取り、その名前を表示します。

引数が指定されていない場合は、エラーメッセージを表示します。

fopen関数を用いたファイルのオープン

ファイルを開くには、fopen関数を使用します。

fopenはファイル名とモードを指定してファイルを開き、ファイルポインタを返します。

以下のコードは、指定されたファイルを読み取りモードで開く例です。

#include <stdio.h>
int main(int argc, char *argv[]) {
    if (argc < 2) {
        printf("ファイル名を指定してください。\n");
        return 1;
    }
    // ファイルを開く
    FILE *file = fopen(argv[1], "r");
    if (file == NULL) {
        printf("ファイルを開けませんでした。\n");
        return 1;
    }
    printf("ファイルを正常に開きました。\n");
    fclose(file);
    return 0;
}
$ ./program sample.txt
ファイルを正常に開きました。

このプログラムは、指定されたファイルを開き、成功した場合はメッセージを表示します。

ファイルが存在しない場合や開けない場合はエラーメッセージを表示します。

ファイルが指定されていない場合の処理

ファイル名が指定されていない場合、プログラムは適切なエラーメッセージを表示し、終了する必要があります。

以下のコードは、引数が不足している場合の処理を示しています。

#include <stdio.h>
int main(int argc, char *argv[]) {
    if (argc < 2) {
        printf("エラー: ファイル名を指定してください。\n");
        return 1;
    }
    // ファイルを開く処理
    FILE *file = fopen(argv[1], "r");
    if (file == NULL) {
        printf("ファイルを開けませんでした。\n");
        return 1;
    }
    printf("ファイルを正常に開きました。\n");
    fclose(file);
    return 0;
}

このプログラムは、引数が不足している場合にエラーメッセージを表示し、プログラムを終了します。

複数ファイルの処理

複数のファイルを処理する場合、argv配列を利用して、各ファイルを順に開くことができます。

以下のコードは、複数のファイルを開き、それぞれのファイル名を表示する例です。

#include <stdio.h>
int main(int argc, char *argv[]) {
    if (argc < 2) {
        printf("少なくとも1つのファイル名を指定してください。\n");
        return 1;
    }
    for (int i = 1; i < argc; i++) {
        FILE *file = fopen(argv[i], "r");
        if (file == NULL) {
            printf("ファイル %s を開けませんでした。\n", argv[i]);
            continue;
        }
        printf("ファイル %s を正常に開きました。\n", argv[i]);
        fclose(file);
    }
    return 0;
}
$ ./program file1.txt file2.txt
ファイル file1.txt を正常に開きました。
ファイル file2.txt を正常に開きました。

このプログラムは、指定されたすべてのファイルを順に開き、開けたファイルの名前を表示します。

開けないファイルがあった場合は、そのファイル名とともにエラーメッセージを表示します。

応用例

コマンドライン引数を利用してファイルを指定する方法を応用することで、さまざまなファイル操作を行うことができます。

ここでは、いくつかの応用例を紹介します。

ファイルの内容を標準出力に表示するプログラム

指定されたファイルの内容を標準出力に表示するプログラムを作成します。

このプログラムは、ファイルを1行ずつ読み込み、その内容を表示します。

#include <stdio.h>
int main(int argc, char *argv[]) {
    if (argc < 2) {
        printf("ファイル名を指定してください。\n");
        return 1;
    }
    FILE *file = fopen(argv[1], "r");
    if (file == NULL) {
        printf("ファイルを開けませんでした。\n");
        return 1;
    }
    char line[256];
    while (fgets(line, sizeof(line), file)) {
        printf("%s", line);
    }
    fclose(file);
    return 0;
}
$ ./program sample.txt
これはサンプルファイルの内容です。
複数行にわたって表示されます。

このプログラムは、指定されたファイルを開き、その内容を1行ずつ標準出力に表示します。

fgets関数を使用して、ファイルから1行ずつ読み込んでいます。

指定されたファイルの行数をカウントするプログラム

次に、指定されたファイルの行数をカウントするプログラムを作成します。

このプログラムは、ファイルを1行ずつ読み込み、行数をカウントします。

#include <stdio.h>
int main(int argc, char *argv[]) {
    if (argc < 2) {
        printf("ファイル名を指定してください。\n");
        return 1;
    }
    FILE *file = fopen(argv[1], "r");
    if (file == NULL) {
        printf("ファイルを開けませんでした。\n");
        return 1;
    }
    int lineCount = 0;
    char line[256];
    while (fgets(line, sizeof(line), file)) {
        lineCount++;
    }
    printf("ファイルの行数: %d\n", lineCount);
    fclose(file);
    return 0;
}
$ ./program sample.txt
ファイルの行数: 3

このプログラムは、指定されたファイルを開き、fgets関数を用いて1行ずつ読み込みながら行数をカウントします。

最終的に、行数を表示します。

複数ファイルを連結して出力するプログラム

複数のファイルを連結して、その内容を標準出力に表示するプログラムを作成します。

このプログラムは、指定されたすべてのファイルを順に開き、その内容を表示します。

#include <stdio.h>
int main(int argc, char *argv[]) {
    if (argc < 2) {
        printf("少なくとも1つのファイル名を指定してください。\n");
        return 1;
    }
    for (int i = 1; i < argc; i++) {
        FILE *file = fopen(argv[i], "r");
        if (file == NULL) {
            printf("ファイル %s を開けませんでした。\n", argv[i]);
            continue;
        }
        char line[256];
        while (fgets(line, sizeof(line), file)) {
            printf("%s", line);
        }
        fclose(file);
    }
    return 0;
}
$ ./program file1.txt file2.txt
ファイル1の内容
ファイル2の内容

このプログラムは、指定されたすべてのファイルを順に開き、それぞれの内容を標準出力に表示します。

ファイルが開けない場合は、そのファイル名とともにエラーメッセージを表示します。

まとめ

この記事では、C言語におけるコマンドライン引数を用いたファイル処理の方法について詳しく解説しました。

コマンドライン引数を利用することで、プログラムの柔軟性を高め、さまざまなファイル操作を実現できます。

これを機に、実際にプログラムを作成し、コマンドライン引数を活用したファイル処理を試してみてください。

関連記事

Back to top button