- ベストアンサー
ファイル名である文字列からbasenameを取得したい
ファイル名である文字列からbasenameを(スマートに)取得したいです。 Perlでは何も考えなくてもできたのですが、C(もしくはC++)では次のようなやりかたしか思いつきません。 これでできているので問題ないのですが、何だかモヤモヤします。 また、このやり方では拡張子はピリオド含めて4文字であること前提なのもモヤモヤの原因です。 Perlのようにもっとスマートなやりかたはないでしょうか? --------------------------------- char filename[] = "test.dat"; char basename[128]; strncpy(basename, filename, strlen(filename)-4); basename[strlen(filename)-4] = '\0'; ---------------------------------
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
拡張子がないとか、base自体に.を含むとか、考えると、例えばVCなら_splitpath関数を使うのが一番スマートかも。 C++ならstd::string::find_last_ofで.を探して、 std::string::substrやiterator等の組み合わせで部分文字列を抽出するとか。
その他の回答 (4)
- jacta
- ベストアンサー率26% (845/3158)
最後のピリオドを探すのであれば、strrchrを使えば一発でできますが、foo.tar.gzのようなファイル名の場合、本当にそれでよいのか、いまいち不安が残りますね。
- yaemon_2006
- ベストアンサー率22% (50/220)
発展・・・かな? #include <stdio.h> #include <string.h> int main(void) { char filename[] = "test0.test1.test2.dat"; char *pch, *temp; pch = NULL; for(temp = filename; (temp = strchr(temp, '.')) != NULL; temp ++) pch = temp; if(pch != NULL) *pch = '\0'; printf("%s", filename); return 0; }
お礼
ありがとうございます。 strchrも検討してみます。
- yaemon_2006
- ベストアンサー率22% (50/220)
#include <stdio.h> #include <string.h> int main(void) { char filename[] = "test.dat"; char *pch; if((pch = strchr(filename, '.')) != NULL) *pch = '\0'; printf("%s", filename); return 0; }
- kumaneko21
- ベストアンサー率33% (9/27)
1.ファイルネームが格納された文字列を先頭から順に一文字ずつピリオドかどうかをチェックする。 2.ピリオドでない場合はベースネームを格納する文字列にその文字をコピー、ピリオドの場合は'\0'を書き込んで関数を抜ける っていうのはどうでしょう?
お礼
ありがとうございます。 この方法が一番オーソドックスで自然かもしれないです。
お礼
_splitpath関数ですか。知らなかったのでちょっと調べてみます。 VC以外はダメなんですかね? ちょっとそこのところが躊躇されますが、自分はVCなので使ってみます。 スマートそうな匂いがしています。