2010-11-30 84 views
4

まず、Boostやその他の外部ライブラリを使用したくありません。私はちょうどC++標準ライブラリを使いたいと思う。私は簡単に私のsplit()機能で指定した区切り文字で文字列を分割することができます。C++ - ファイル名とファイル拡張子の分割

void split(std::string &string, std::vector<std::string> &tokens, const char &delim) { 
    std::string ea; 
    std::stringstream stream(string); 
    while(getline(stream, ea, delim)) 
     tokens.push_back(ea); 
} 

私はファイル名でこれを行います。しかし問題があります。拡張子がtar.gz,tar.bz2などのファイルもあります。また、余分なドットを含むファイル名もあります。 Some.file.name.tar.gzSome.file.nametar.gz注:ファイル名のドット数は一定ではありません。

私もPathFindExtensionが、運を試してみました。これは可能ですか?もしそうなら、私に教えてください。ありがとうございました。

編集:OSを指定しないのは大変残念です。それはWindowsだ。

+1

あなたは、唯一のC++標準ライブラリを使用したい 'PathFindExtension' ... –

答えて

6

を、私はあなたがstd::stringfind_last_ofが最後.のインデックスを取得するために使用することができると思い、そしてsubstrカットします(複数の点を含む複雑な拡張機能は追加の作業が必要ですが)文字列です。

+0

完璧に作業しました。ありがとう。このようのようなパスを使用してファイルに遭遇したとき – Ruel

+0

このメソッドは失敗します:** C:\ Some.Folder \ somefileという** –

+0

b1naryatr0phy @ – icecrime

2

何もC++標準ライブラリではありません - つまり、それは標準ではない - が、私の知っているすべてのオペレーティングシステムは、さまざまな方法でこの機能を提供します。

Windowsのあなたは_splitpathを()を使用することができ、およびLinuxにあなたがdirnameのを使用することができて

()&のbasename()

+0

申し訳ありませんが、' _splitpath() '同様にうまくいかなかった。 – Ruel

0

問題は実際に*.tar.gzのようなファイル名です。これは、(少なくともWindowsでは).tarの部分が拡張の一部ではないため、一貫して分割できません。これらの特別なケースのリストを保持しておき、残りの部分には1ドットのstring::rfindを使用するか、事前に実装された方法を見つける必要があります。 .tar.*拡張は無限ではなく、非常に標準化されていることに注意してください。

+0

しかし、tarユーティリティは、tar.gz、tar.bz2、tar.7z、tar.zなどを一貫して私が見る限り使用します。そのような拡張子を持つファイルを作成するときに必要な圧縮アルゴリズムを自動的に検出します。あなたの例は、私(そしてOP)が話していたもの( 'tar。*'ファイル)ではありません。 – rubenvb

+0

GNU tarはそうです;すべてのバージョンではありません。他のGNUアプリやPOSIXアプリもありません。そのような知識がC++標準ライブラリにない理由を明らかにしてください。 – MSalters

5

あなたの目的のための拡張機能のデータベースを必要としないあなたが望むものをやっての方法はありません。拡張機能について魔法はありません。ファイル名の一部にすぎません(gunzip foo.tar.gzの場合は、foo.tarが得られる可能性が高いので、実際にはこの拡張子は.gzです)。だから、あなたが探している拡張機能のデータベースを構築し、見つからなければ "最後のドット"に戻って、あなたが望むことをするために、データベースを構築してください。

+2

「あなたの目的のために」というフレーズに+1。一般的なファイル名の分割はほぼ不可能です。それほど有用ではありません。 (アプリケーションが移植可能でなければならない場合は、ドットで始まる名前を持つUnixの隠しファイルを処理するために、「最後のドット」ヒューリスティックを拡張する必要があります)。 –

0

あなたが遭遇するかもしれないと思われるファイル拡張子のルックアップテーブルを作成することができます。また、新しいものに遭遇した場合は、コマンドラインオプションを追加してルックアップテーブルに新しいものを追加します。次に、ファイル名を解析して、ルックアップテーブルのエントリがファイル名のサブストリングであるかどうかを確認します。

EDIT:あなたはまた、この質問を参照することができます:あなたはOS固有の機能を試してみてC++/STL string: How to mimic regex like function with wildcards?

関連する問題