質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.30%
文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

5回答

14106閲覧

C++ 拡張子を削除した文字列を取得する方法

kitagawasho

総合スコア28

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2020/02/28 02:47

前提・実現したいこと

下記ソースコードC++の文字列から拡張子を削除した文字列を取得する方法を教えてほしいです。
下記のソースコードC++ならfileNameの中身が"aaaa"になるようにしたいです。

該当のソースコード

C++

1 2string fileName ="aaaa.csv"; 3

VBA

1Function GetFNameFromFStr(ukeFileName As String) As String 2 'ファイル名から拡張子を除いた文字列を取得する 3 4Dim sFileStr As String 5Dim lFindPoint As Long 6Dim lStrLen As Long 7 8'文字列の右端から"."を検索し、左端からの位置を取得する 9lFindPoint = InStrRev(ukeFileName, ".") 10 11'拡張子を除いたファイル名の取得 12sFileStr = Left(ukeFileName, lFindPoint - 1) 13 14GetFNameFromFStr = sFileStr 15 16End Function

試したこと

ネットで探したところ、ソースコードVBAを見つけました。
おそらくこのソースコードをC++に直せばいいと思っていますが、
もっと簡単であったり、C++ならこうすればいいとかありましたら教えてほしいです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答5

2

ベストアンサー

こういうのを使えばどうでしょう.

投稿2020/02/28 03:26

fana

総合スコア12182

yumetodo, yohhoy👍を押しています

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fana

2020/02/28 03:33

"."とか".."の面倒も見てくれるみたいだし.
cateye

2020/02/28 03:33

ありがとう、勉強に成りましたv^^
yumetodo

2020/02/28 03:38

せっかくC++17でfilesystem入ったし、自分で書かなくて済むならそうしたいですよね。
guest

1

fanaさんの回答のサンプル書いておきますね

cpp

1#include <iostream> 2#include <filesystem> 3int main() 4{ 5 std::filesystem::path p = "aaaa.csv"; 6 std::cout << p.stem().string<char>() << std::endl; 7}

https://wandbox.org/permlink/kgoNXhU2udzpmWa4

投稿2020/02/28 03:36

yumetodo

総合スコア5852

kitagawasho👍を押しています

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

cateye

2020/02/28 03:48

"std::filesystem::path p = "~/Project/test/aaaa.csv";"のような場合は、拡張子のみならず、~/Project/test/も消えちゃいますね?・・・まぁ、質問の内容がファイル名.拡張子なんでいいのですが・・・
guest

1

substr の代わりに resize を使う方法

C++

1#include <iostream> 2#include <string> 3using namespace std; 4 5string getNameFromStr(string s) 6{ 7 string::size_type n = s.rfind('.'); 8 if (n != string::npos) s.resize(n); 9 return s; 10} 11 12int main() 13{ 14 string fileName = "aaaa.csv"; 15 cout << getNameFromStr(fileName) << endl; 16}

投稿2020/02/28 03:26

kazuma-s

総合スコア8222

kitagawasho👍を押しています

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

1

fileName.rfind('.');
で見つけて、そこまでをsubstr()で取り出しましょう。
→ std::basic_string::rfind
追記
yumetodoさんの補足です。パスが有る場合も処理できます。

text

1usr ~/Project/test % c++ t1.cpp 2usr ~/Project/test % ./a.out 3~/Project/test/aaaa 4usr ~/Project/test % cat t1.cpp 5#include <iostream> 6#include <filesystem> 7int main(void) 8{ 9 std::filesystem::path p = "~/Project/test/aaaa.csv"; 10 std::cout << p.parent_path().string<char>() << p.preferred_separator << p.stem().string<char>() << std::endl; 11 // 12 return 0; 13} 14 15usr ~/Project/test %

追記の追記w rfind()とsubstr()使ってみた。
usr ~/Project/test % ./a.out
~/Project/test/aaaa

c++

1#include <iostream> 2#include <string> 3int main(void) 4{ 5 // 6 std::string path = "~/Project/test/aaaa.csv"; 7 std::cout << path.substr(0,path.rfind('.')) << std::endl; 8 // 9 return 0; 10}

投稿2020/02/28 03:11

編集2020/02/28 06:10
cateye

総合スコア6851

kitagawasho👍を押しています

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

cateye

2020/02/28 03:31

rfind()は、見つからない時にstd::string::nposを返します。 ・・・従って、(文字列中にピリオド'.'が有ることが保証されない等)必要ならばチェックしましょう。
guest

1

C++でInStrRevと同様の機能があるのは、rfind関数です。

leftの代わりには、substr関数を使います。

投稿2020/02/28 03:02

coco_bauer

総合スコア6919

kitagawasho👍を押しています

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.30%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問