• ベストアンサー

ファイル名である文字列から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'; ---------------------------------

質問者が選んだベストアンサー

  • ベストアンサー
  • MrBan
  • ベストアンサー率53% (331/615)
回答No.3

拡張子がないとか、base自体に.を含むとか、考えると、例えばVCなら_splitpath関数を使うのが一番スマートかも。 C++ならstd::string::find_last_ofで.を探して、 std::string::substrやiterator等の組み合わせで部分文字列を抽出するとか。

ooss
質問者

お礼

_splitpath関数ですか。知らなかったのでちょっと調べてみます。 VC以外はダメなんですかね? ちょっとそこのところが躊躇されますが、自分はVCなので使ってみます。 スマートそうな匂いがしています。

その他の回答 (4)

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.5

最後のピリオドを探すのであれば、strrchrを使えば一発でできますが、foo.tar.gzのようなファイル名の場合、本当にそれでよいのか、いまいち不安が残りますね。

回答No.4

   発展・・・かな? #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; }  

ooss
質問者

お礼

ありがとうございます。 strchrも検討してみます。

回答No.2

  #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; }  

回答No.1

1.ファイルネームが格納された文字列を先頭から順に一文字ずつピリオドかどうかをチェックする。 2.ピリオドでない場合はベースネームを格納する文字列にその文字をコピー、ピリオドの場合は'\0'を書き込んで関数を抜ける っていうのはどうでしょう?

ooss
質問者

お礼

ありがとうございます。 この方法が一番オーソドックスで自然かもしれないです。

関連するQ&A

専門家に質問してみよう