[C言語] ファイル名から拡張子を削除する方法

C言語でファイル名から拡張子を削除するには、文字列操作を行います。

まず、ファイル名を表す文字列を用意し、拡張子の開始位置を見つけるために関数strrchrを使用します。

この関数は、文字列内で最後に現れる特定の文字、通常はドット'.'を探します。

見つかった位置をNULLでない場合に限り、文字列をその位置で終端させることで拡張子を削除できます。

この方法は、ファイル名に複数のドットが含まれる場合でも、最後のドット以降を削除するために有効です。

この記事でわかること
  • ファイル名から拡張子を削除する基本的な方法
  • 複数ファイルの拡張子を一括で削除する方法
  • ファイル名の拡張子を変更する手法
  • 拡張子の有無を確認する方法
  • 他のプログラミング言語での類似操作の可能性

目次から探す

ファイル名から拡張子を削除する方法

拡張子の位置を特定する

ファイル名から拡張子を削除するためには、まず拡張子の位置を特定する必要があります。

拡張子は通常、ファイル名の最後のドット.以降に続く文字列です。

C言語では、標準ライブラリの関数を使用してこの位置を特定することができます。

  • strrchr関数を使用して、文字列内の最後のドットの位置を見つけます。
  • ドットが見つからない場合は、拡張子がないと判断します。

文字列を切り取る方法

拡張子の位置が特定できたら、その位置までの文字列を切り取ることで、拡張子を削除したファイル名を取得できます。

C言語では、以下の方法で文字列を切り取ることが可能です。

  • strncpy関数を使用して、元の文字列から拡張子の位置までの部分を新しい文字列にコピーします。
  • コピーした文字列の末尾にヌル文字\0を追加して、正しい文字列として扱います。

サンプルコードの解説

以下に、ファイル名から拡張子を削除するサンプルコードを示します。

#include <stdio.h>
#include <string.h>
void removeExtension(char *filename, char *result) {
    // ファイル名の最後のドットを探す
    char *dot = strrchr(filename, '.');
    if (dot != NULL) {
        // ドットの位置までの文字列をコピー
        strncpy(result, filename, dot - filename);
        result[dot - filename] = '
#include <stdio.h>
#include <string.h>
void removeExtension(char *filename, char *result) {
    // ファイル名の最後のドットを探す
    char *dot = strrchr(filename, '.');
    if (dot != NULL) {
        // ドットの位置までの文字列をコピー
        strncpy(result, filename, dot - filename);
        result[dot - filename] = '\0'; // ヌル文字を追加
    } else {
        // ドットがない場合はそのままコピー
        strcpy(result, filename);
    }
}
int main() {
    char filename[] = "example.txt";
    char result[256];
    removeExtension(filename, result);
    printf("拡張子を削除したファイル名: %s\n", result);
    return 0;
}
'; // ヌル文字を追加 } else { // ドットがない場合はそのままコピー strcpy(result, filename); } } int main() { char filename[] = "example.txt"; char result[256]; removeExtension(filename, result); printf("拡張子を削除したファイル名: %s\n", result); return 0; }
拡張子を削除したファイル名: example

このコードでは、removeExtension関数を使用して、指定されたファイル名から拡張子を削除しています。

strrchr関数で最後のドットを見つけ、その位置までの文字列をstrncpyでコピーしています。

ドットが見つからない場合は、元のファイル名をそのままコピーします。

応用例

複数ファイルの拡張子を一括削除

複数のファイル名から一括で拡張子を削除する場合、配列やリストを使用してファイル名を管理し、ループを用いて処理を行います。

以下にその例を示します。

#include <stdio.h>
#include <string.h>
void removeExtension(char *filename, char *result) {
    char *dot = strrchr(filename, '.');
    if (dot != NULL) {
        strncpy(result, filename, dot - filename);
        result[dot - filename] = '
#include <stdio.h>
#include <string.h>
void removeExtension(char *filename, char *result) {
    char *dot = strrchr(filename, '.');
    if (dot != NULL) {
        strncpy(result, filename, dot - filename);
        result[dot - filename] = '\0';
    } else {
        strcpy(result, filename);
    }
}
int main() {
    char *filenames[] = {"file1.txt", "document.pdf", "image.jpeg"};
    char result[256];
    int numFiles = sizeof(filenames) / sizeof(filenames[0]);
    for (int i = 0; i < numFiles; i++) {
        removeExtension(filenames[i], result);
        printf("拡張子を削除したファイル名: %s\n", result);
    }
    return 0;
}
'; } else { strcpy(result, filename); } } int main() { char *filenames[] = {"file1.txt", "document.pdf", "image.jpeg"}; char result[256]; int numFiles = sizeof(filenames) / sizeof(filenames[0]); for (int i = 0; i < numFiles; i++) { removeExtension(filenames[i], result); printf("拡張子を削除したファイル名: %s\n", result); } return 0; }

このコードでは、filenames配列に複数のファイル名を格納し、forループを用いて各ファイル名から拡張子を削除しています。

拡張子を変更する方法

ファイル名の拡張子を変更するには、まず既存の拡張子を削除し、新しい拡張子を追加します。

以下にその例を示します。

#include <stdio.h>
#include <string.h>
void changeExtension(char *filename, char *newExtension, char *result) {
    char *dot = strrchr(filename, '.');
    if (dot != NULL) {
        strncpy(result, filename, dot - filename);
        result[dot - filename] = '
#include <stdio.h>
#include <string.h>
void changeExtension(char *filename, char *newExtension, char *result) {
    char *dot = strrchr(filename, '.');
    if (dot != NULL) {
        strncpy(result, filename, dot - filename);
        result[dot - filename] = '\0';
    } else {
        strcpy(result, filename);
    }
    strcat(result, newExtension);
}
int main() {
    char filename[] = "example.txt";
    char newExtension[] = ".md";
    char result[256];
    changeExtension(filename, newExtension, result);
    printf("拡張子を変更したファイル名: %s\n", result);
    return 0;
}
'; } else { strcpy(result, filename); } strcat(result, newExtension); } int main() { char filename[] = "example.txt"; char newExtension[] = ".md"; char result[256]; changeExtension(filename, newExtension, result); printf("拡張子を変更したファイル名: %s\n", result); return 0; }

このコードでは、changeExtension関数を使用して、指定されたファイル名の拡張子を新しいものに変更しています。

拡張子の有無を確認する方法

ファイル名に拡張子があるかどうかを確認するには、最後のドットの位置を調べる方法が有効です。

以下にその例を示します。

#include <stdio.h>
#include <string.h>
#include <stdbool.h>
bool hasExtension(char *filename) {
    return strrchr(filename, '.') != NULL;
}
int main() {
    char filename[] = "example";
    if (hasExtension(filename)) {
        printf("ファイル名に拡張子があります。\n");
    } else {
        printf("ファイル名に拡張子がありません。\n");
    }
    return 0;
}

このコードでは、hasExtension関数を使用して、ファイル名に拡張子があるかどうかを確認しています。

strrchr関数でドットが見つかれば拡張子があると判断します。

よくある質問

ファイル名にドットが複数ある場合はどうする?

ファイル名にドットが複数ある場合、strrchr関数を使用することで、最後のドットの位置を特定し、その位置以降を拡張子と見なします。

例えば、ファイル名がarchive.tar.gzの場合、最後のドット以降のgzが拡張子として扱われます。

したがって、strrchrを使うことで、正しく拡張子を削除することができます。

拡張子がないファイル名の場合はどうなる?

拡張子がないファイル名の場合、strrchr関数はドットを見つけられないため、関数はNULLを返します。

この場合、拡張子がないと判断し、ファイル名全体をそのまま使用します。

例:exampleというファイル名の場合、拡張子を削除する処理を行っても、ファイル名は変わりません。

C言語以外の言語でも同様の操作は可能?

はい、C言語以外の多くのプログラミング言語でも同様の操作が可能です。

例えば、Pythonではos.path.splitext関数を使用して拡張子を分離することができます。

例:base, ext = os.path.splitext("example.txt")

このように、各言語には文字列操作のための便利な関数が用意されています。

まとめ

この記事では、C言語を用いてファイル名から拡張子を削除する方法について詳しく解説しました。

拡張子の位置を特定し、文字列を切り取ることで、ファイル名を適切に処理する方法を学びました。

さらに、応用例として複数ファイルの処理や拡張子の変更方法についても紹介しました。

この記事を参考に、実際のプログラムでファイル名の操作を試してみてください。

  • URLをコピーしました!
目次から探す