ファイル名である文字列からbasenameを(スマートに)取得したいです。
Perlでは何も考えなくてもできたのですが、C(もしくはC++)では次のようなやりかたしか思いつきません。
これでできているので問題ないのですが、何だかモヤモヤします。
また、このやり方では拡張子はピリオド含めて4文字であること前提なのもモヤモヤの原因です。
Perlのようにもっとスマートなやりかたはないでしょうか?
---------------------------------
char filename[] = "test.dat";
char basename[128];
strncpy(basename, filename, strlen(filename)-4);
basename[strlen(filename)-4] = '\0';
---------------------------------
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;
}
No.3ベストアンサー
- 回答日時:
拡張子がないとか、base自体に.を含むとか、考えると、例えばVCなら_splitpath関数を使うのが一番スマートかも。
C++ならstd::string::find_last_ofで.を探して、
std::string::substrやiterator等の組み合わせで部分文字列を抽出するとか。
_splitpath関数ですか。知らなかったのでちょっと調べてみます。
VC以外はダメなんですかね?
ちょっとそこのところが躊躇されますが、自分はVCなので使ってみます。
スマートそうな匂いがしています。
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;
}
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PHP ファイルアップロードに関してのセキュリティについてアドバイスお願い致します 1 2023/08/20 00:25
- Visual Basic(VBA) 集めたシートのシート名を変更したい。 下記のコードでサブフォルダにあるファイルのSheet3を集めて 6 2022/08/23 10:38
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
- Visual Basic(VBA) エクセルの数式で教えてください。 1 2023/07/31 15:49
- Visual Basic(VBA) サブフォルダ(データ)にある複数の.xlsxファイルのSheet3のA2セルの値で01から左側をB2 2 2022/08/14 15:46
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- Excel(エクセル) Excel VBAどこが間違ってますか? 4 2023/07/17 10:04
- Visual Basic(VBA) 貼り付けた値が消えていく 以下はソースファイルの2番目のシートのB6から最終行を取得 ターゲットファ 2 2023/07/27 12:23
- Excel(エクセル) 【VBA】PDF出力に任意のファイル名前を付ける方法 3 2023/07/21 10:55
- CGI htmlからパラメータで、cgiに渡したい。 1 2023/02/06 16:15
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
fgetsなどのときのstdinのバッ...
-
配列をnビットシフトする
-
CStringをwchar_tに変換したい
-
double型の値をchar配列に変換...
-
コンパイルエラー invalid ope...
-
variant型ってどのような仕組み...
-
strchr() の第2引数はなぜ int ...
-
C++ の FileCopy の設定が解り...
-
int main()の・・・
-
_TCHAR*での引数の読み込み
-
c++ 文字列を入力して、一文字...
-
-'0'の意味について
-
コマンドラインに入力されてい...
-
数字文字の出現回数を表示する...
-
文字列がNULLか空文字列かの判定
-
new
-
sprintfに同じ変数は使えるか
-
間接参照のレベルが異なっています
-
charからLPTSTRへの変換方法
-
c言語
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
fgetsなどのときのstdinのバッ...
-
charでの計算?
-
C言語のfor文です。 繰り返しの...
-
charからLPTSTRへの変換方法
-
文字列から空白を取り除きたい...
-
C言語の入力した文字を反転させ...
-
'const char *' 型は 'char *' ...
-
配列をnビットシフトする
-
str系関数を使わずに二つの文字...
-
int main()の・・・
-
atoi( ) の反対をやりたい
-
CStringをwchar_tに変換したい
-
c++ 文字列を入力して、一文字...
-
switch文で文字を比較すること...
-
干支のプログラム
-
3桁区切(コンマ)記号をつけ...
-
絶対パスからのファイル名の切...
-
間接操作のレベルとは
-
間接参照のレベルが異なっています
-
型変換
おすすめ情報