ファイル

[C言語] ファイル名から拡張子だけを取得する方法

C言語でファイル名から拡張子を取得するには、文字列操作を行う必要があります。

一般的な方法として、標準ライブラリの関数であるstrrchrを使用します。

この関数は、指定した文字が最後に現れる位置を返します。

ファイル名の文字列に対してstrrchrを使い、ドット'.'を検索することで、拡張子の開始位置を特定できます。

その後、取得したポインタを利用して拡張子を抽出します。

この方法は、ファイル名に複数のドットが含まれている場合でも、最後のドット以降の文字列を拡張子として正確に取得できます。

ファイル名から拡張子を取得する方法

ファイル名から拡張子を取得することは、ファイルの種類を判別するために重要です。

C言語では、標準ライブラリの関数を利用することで簡単に拡張子を取得できます。

ここでは、strrchr関数strtok関数、そして自作関数を用いた方法を紹介します。

strrchr関数の利用

strrchr関数は、文字列中の特定の文字を右から検索し、その位置を返します。

これを利用して、ファイル名から拡張子を取得することができます。

#include <stdio.h>
#include <string.h>
int main() {
    // ファイル名の例
    char filename[] = "example.txt";
    // '.'を右から検索
    char *extension = strrchr(filename, '.');
    
    if (extension != NULL) {
        // 拡張子を表示
        printf("拡張子: %s\n", extension + 1);
    } else {
        printf("拡張子が見つかりません。\n");
    }
    return 0;
}
拡張子: txt

このコードでは、strrchr関数を使ってファイル名の中から最後のドットを探し、その後の文字列を拡張子として取得しています。

strtok関数の利用

strtok関数は、文字列を特定の区切り文字で分割するために使用されます。

これを利用して、ファイル名をドットで分割し、最後のトークンを拡張子として取得します。

#include <stdio.h>
#include <string.h>
int main() {
    // ファイル名の例
    char filename[] = "example.txt";
    char *token;
    char *lastToken = NULL;
    // '.'で分割
    token = strtok(filename, ".");
    while (token != NULL) {
        lastToken = token;
        token = strtok(NULL, ".");
    }
    if (lastToken != NULL) {
        // 拡張子を表示
        printf("拡張子: %s\n", lastToken);
    } else {
        printf("拡張子が見つかりません。\n");
    }
    return 0;
}
拡張子: txt

このコードでは、strtok関数を使ってファイル名をドットで分割し、最後に取得したトークンを拡張子として表示しています。

自作関数での実装

標準ライブラリを使わずに、自作関数で拡張子を取得する方法もあります。

以下の例では、文字列を逆から走査してドットを探し、拡張子を取得します。

#include <stdio.h>
#include <string.h>
// 拡張子を取得する自作関数
const char* getFileExtension(const char *filename) {
    const char *dot = strrchr(filename, '.');
    if (!dot || dot == filename) return "";
    return dot + 1;
}
int main() {
    // ファイル名の例
    const char *filename = "example.txt";
    // 自作関数を使って拡張子を取得
    const char *extension = getFileExtension(filename);
    
    if (strlen(extension) > 0) {
        // 拡張子を表示
        printf("拡張子: %s\n", extension);
    } else {
        printf("拡張子が見つかりません。\n");
    }
    return 0;
}
拡張子: txt

この自作関数では、strrchrを内部で使用し、ドットの位置を確認してから拡張子を返しています。

標準関数を使わずに実装することで、より柔軟な処理が可能です。

応用例

ファイル名から拡張子を取得する基本的な方法を理解したところで、さらに応用的なシナリオについて考えてみましょう。

ここでは、複数の拡張子を持つファイルの処理、拡張子のないファイル名の処理、大文字小文字を区別しない拡張子の取得について解説します。

複数の拡張子を持つファイルの処理

ファイル名には、複数のドットが含まれる場合があります。

例えば、圧縮ファイルの拡張子が .tar.gz のように複数ある場合です。

このようなケースでは、最後のドット以降を拡張子として扱うのが一般的です。

#include <stdio.h>
#include <string.h>
// 複数の拡張子を持つファイルの拡張子を取得する関数
const char* getLastExtension(const char *filename) {
    const char *dot = strrchr(filename, '.');
    if (!dot || dot == filename) return "";
    return dot + 1;
}
int main() {
    // 複数の拡張子を持つファイル名の例
    const char *filename = "archive.tar.gz";
    // 拡張子を取得
    const char *extension = getLastExtension(filename);
    
    if (strlen(extension) > 0) {
        // 拡張子を表示
        printf("拡張子: %s\n", extension);
    } else {
        printf("拡張子が見つかりません。\n");
    }
    return 0;
}
拡張子: gz

このコードでは、strrchrを使って最後のドットを探し、その後の文字列を拡張子として取得しています。

拡張子のないファイル名の処理

拡張子がないファイル名も存在します。

この場合、拡張子がないことを適切に処理する必要があります。

#include <stdio.h>
#include <string.h>
// 拡張子を取得する関数
const char* getFileExtension(const char *filename) {
    const char *dot = strrchr(filename, '.');
    if (!dot || dot == filename) return "";
    return dot + 1;
}
int main() {
    // 拡張子のないファイル名の例
    const char *filename = "README";
    // 拡張子を取得
    const char *extension = getFileExtension(filename);
    
    if (strlen(extension) > 0) {
        // 拡張子を表示
        printf("拡張子: %s\n", extension);
    } else {
        printf("拡張子が見つかりません。\n");
    }
    return 0;
}
拡張子が見つかりません。

このコードでは、拡張子がない場合に空文字列を返し、適切なメッセージを表示しています。

大文字小文字を区別しない拡張子の取得

ファイルシステムによっては、拡張子の大文字小文字を区別しない場合があります。

C言語でこれを実現するには、取得した拡張子を小文字に変換して比較する方法があります。

#include <stdio.h>
#include <string.h>
#include <ctype.h>
// 拡張子を小文字に変換する関数
void toLowerCase(char *str) {
    for (; *str; ++str) *str = tolower(*str);
}
int main() {
    // ファイル名の例
    char filename[] = "Document.PDF";
    char *extension = strrchr(filename, '.');
    
    if (extension != NULL) {
        extension++; // '.'の次の文字から拡張子
        toLowerCase(extension);
        // 拡張子を表示
        printf("拡張子: %s\n", extension);
    } else {
        printf("拡張子が見つかりません。\n");
    }
    return 0;
}
拡張子: pdf

このコードでは、tolower関数を使って拡張子を小文字に変換し、表示しています。

これにより、大文字小文字を区別しない処理が可能になります。

まとめ

この記事では、C言語でファイル名から拡張子を取得する方法について、strrchr関数strtok関数、自作関数を用いた実装を紹介しました。

さらに、応用例として複数の拡張子を持つファイルや拡張子がないファイルの処理、大文字小文字を区別しない取得方法についても解説しました。

これらの知識を活用することで、ファイル操作の幅が広がり、より柔軟なプログラムを作成することができます。

ぜひ、実際のプログラミングでこれらの方法を試してみてください。

関連記事

Back to top button