ファイル

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

C++でファイル名から拡張子を取得するには、文字列操作を行います。

標準ライブラリのstd::stringを使用する場合、find_last_ofで最後のドット位置を特定し、substrで拡張子部分を切り出します。

例えば、filename.find_last_of('.')でドットの位置を取得し、filename.substr(pos)で拡張子を取得します。

C++17以降では、std::filesystemライブラリのpathクラスを使い、path.extension()メソッドで簡単に拡張子を取得できます。

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

C++において、ファイル名から拡張子を取得することは、ファイル操作やデータ処理を行う際に非常に重要です。

拡張子は、ファイルの種類を示すため、適切な処理を行うための手がかりとなります。

この記事では、C++を使用してファイル名から拡張子を取得する方法について解説します。

拡張子を取得する方法はいくつかありますが、主に以下の方法が一般的です。

方法説明
文字列操作を使用std::stringを使って手動で処理する方法
std::filesystemを使用C++17以降の標準ライブラリを利用する方法

これらの方法を使うことで、ファイル名から簡単に拡張子を取得することができます。

次のセクションでは、標準ライブラリを使った具体的な方法について詳しく見ていきます。

標準ライブラリを使った拡張子の取得方法

C++の標準ライブラリを使用してファイル名から拡張子を取得する方法の一つは、std::stringを利用した文字列操作です。

この方法では、ファイル名の最後のドット.以降の部分を取得することで拡張子を特定します。

以下に具体的なサンプルコードを示します。

#include <iostream>
#include <string>
std::string getExtension(const std::string& filename) {
    // 最後のドットの位置を探す
    size_t dotPosition = filename.find_last_of('.');
    
    // ドットが見つからない場合は空文字を返す
    if (dotPosition == std::string::npos) {
        return ""; // 拡張子がない場合
    }
    
    // ドット以降の文字列を返す
    return filename.substr(dotPosition + 1);
}
int main() {
    std::string filename = "example.txt"; // ファイル名
    std::string extension = getExtension(filename); // 拡張子を取得
    
    std::cout << "ファイル名: " << filename << std::endl; // ファイル名を表示
    std::cout << "拡張子: " << extension << std::endl; // 拡張子を表示
    
    return 0;
}
ファイル名: example.txt
拡張子: txt

このコードでは、getExtension関数がファイル名を引数に取り、拡張子を返します。

find_last_ofメソッドを使用して、最後のドットの位置を特定し、その位置以降の文字列をsubstrメソッドで取得しています。

ドットが見つからない場合は、空文字を返すようにしています。

これにより、拡張子が存在しないファイル名にも対応できます。

C++17以降のstd::filesystemを使った方法

C++17から追加されたstd::filesystemライブラリを使用すると、ファイルシステムに関する操作がより簡単かつ直感的に行えるようになります。

このライブラリを利用することで、ファイル名から拡張子を取得することも容易になります。

以下に具体的なサンプルコードを示します。

#include <iostream>
#include <filesystem> // std::filesystemを使用するためのインクルード
std::string getExtension(const std::filesystem::path& filepath) {
    // 拡張子を取得
    return filepath.extension().string(); // 拡張子を文字列として返す
}
int main() {
    std::filesystem::path filepath = "example.txt"; // ファイルパスを指定
    std::string extension = getExtension(filepath); // 拡張子を取得
    
    std::cout << "ファイル名: " << filepath.filename() << std::endl; // ファイル名を表示
    std::cout << "拡張子: " << extension << std::endl; // 拡張子を表示
    
    return 0;
}
ファイル名: example.txt
拡張子: .txt

このコードでは、std::filesystem::pathを使用してファイルパスを表現しています。

extension()メソッドを呼び出すことで、ファイルの拡張子を簡単に取得できます。

string()メソッドを使って、拡張子を文字列形式で返しています。

std::filesystemを利用することで、ファイル名や拡張子の取得がよりシンプルになり、可読性も向上します。

実践例:さまざまなケースでの拡張子取得

ファイル名から拡張子を取得する際には、さまざまなケースが考えられます。

ここでは、いくつかの異なるファイル名を用いて、拡張子取得の実践例を示します。

以下のサンプルコードでは、複数のファイル名に対して拡張子を取得し、その結果を表示します。

#include <iostream>
#include <string>
#include <vector>
std::string getExtension(const std::string& filename) {
    size_t dotPosition = filename.find_last_of('.');
    if (dotPosition == std::string::npos) {
        return ""; // 拡張子がない場合
    }
    return filename.substr(dotPosition + 1);
}
int main() {
    // 様々なファイル名のリスト
    std::vector<std::string> filenames = {
        "document.pdf",
        "archive.tar.gz",
        "image.jpeg",
        "no_extension",
        "script.py",
        "config.json"
    };
    // 各ファイル名に対して拡張子を取得
    for (const auto& filename : filenames) {
        std::string extension = getExtension(filename);
        std::cout << "ファイル名: " << filename << " | 拡張子: " << extension << std::endl;
    }
    return 0;
}
ファイル名: document.pdf | 拡張子: pdf
ファイル名: archive.tar.gz | 拡張子: gz
ファイル名: image.jpeg | 拡張子: jpeg
ファイル名: no_extension | 拡張子: 
ファイル名: script.py | 拡張子: py
ファイル名: config.json | 拡張子: json

このコードでは、std::vectorを使用して複数のファイル名を格納し、getExtension関数を使ってそれぞれの拡張子を取得しています。

特に、archive.tar.gzのように複数のドットを含むファイル名や、拡張子がないファイル名no_extensionに対しても正しく処理できることが確認できます。

これにより、さまざまなケースに対応した拡張子取得の実践例を示しました。

応用:拡張子を変更・削除する方法

ファイル名から拡張子を取得するだけでなく、拡張子を変更したり削除したりすることもよくあります。

ここでは、C++を使用して拡張子を変更する方法と、拡張子を削除する方法について解説します。

以下にそれぞれのサンプルコードを示します。

拡張子を変更する方法

拡張子を変更するには、まず現在の拡張子を取得し、新しい拡張子を付加する必要があります。

以下のサンプルコードでは、指定した新しい拡張子に変更する方法を示します。

#include <iostream>
#include <string>
std::string changeExtension(const std::string& filename, const std::string& newExtension) {
    size_t dotPosition = filename.find_last_of('.');
    
    // 拡張子がない場合はそのまま新しい拡張子を追加
    if (dotPosition == std::string::npos) {
        return filename + "." + newExtension; // 新しい拡張子を追加
    }
    
    // 拡張子を変更
    return filename.substr(0, dotPosition) + "." + newExtension;
}
int main() {
    std::string filename = "example.txt"; // 元のファイル名
    std::string newExtension = "md"; // 新しい拡張子
    std::string newFilename = changeExtension(filename, newExtension); // 拡張子を変更
    
    std::cout << "元のファイル名: " << filename << std::endl; // 元のファイル名を表示
    std::cout << "新しいファイル名: " << newFilename << std::endl; // 新しいファイル名を表示
    
    return 0;
}
元のファイル名: example.txt
新しいファイル名: example.md

このコードでは、changeExtension関数を使用して、指定した新しい拡張子に変更しています。

元のファイル名から拡張子を削除し、新しい拡張子を追加することで新しいファイル名を生成しています。

拡張子を削除する方法

拡張子を削除する場合も、find_last_ofメソッドを使用して最後のドットの位置を特定し、その位置までの文字列を取得します。

以下にそのサンプルコードを示します。

#include <iostream>
#include <string>
std::string removeExtension(const std::string& filename) {
    size_t dotPosition = filename.find_last_of('.');
    
    // 拡張子がない場合はそのまま返す
    if (dotPosition == std::string::npos) {
        return filename; // 拡張子がない場合
    }
    
    // 拡張子を削除
    return filename.substr(0, dotPosition);
}
int main() {
    std::string filename = "example.txt"; // 元のファイル名
    std::string filenameWithoutExtension = removeExtension(filename); // 拡張子を削除
    
    std::cout << "元のファイル名: " << filename << std::endl; // 元のファイル名を表示
    std::cout << "拡張子を削除したファイル名: " << filenameWithoutExtension << std::endl; // 拡張子を削除したファイル名を表示
    
    return 0;
}
元のファイル名: example.txt
拡張子を削除したファイル名: example

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

拡張子が存在しない場合は、そのまま元のファイル名を返すようにしています。

これにより、拡張子の変更や削除が簡単に行えることがわかります。

まとめ

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

標準ライブラリやC++17以降のstd::filesystemを活用することで、拡張子の取得や変更、削除が簡単に行えることがわかりました。

これらの技術を活用して、ファイル操作をより効率的に行うためのプログラムを作成してみてください。

関連記事

Back to top button