ファイルのパスを取得し、そこからファイル名だけを取得
したいと考えてます。
ファイルのパスを取得するところまではできたのですが、
そこからファイル名だけを取得するところでつまずいています。
char edit_str = "C:\usr\local\main.cpp";
このようにパスが格納されているとして、
edit_str = "main.cpp";
にしたいのですが、
どのようにすればいいでしょうか?
Cの標準関数を利用すると
char *ans;
ans = strstr( edit_str, "\\"); //"\\"が含まれているかどうかを検索
while( ans ){ // "\\"が含まれている間
// ファイル名のみを取得する操作
}
このwhile文のなかで、
別の文字列に"\\"が含まれない部分をコピーする
といったことができたらとおもったのですが、
文字列を削除するといった関数がないため、
使える関数がわかりませんでした。
よろしくお願い致します。
↓こんなんでえぇですか?
#include <iostream>
#include <cstring>
int main() {
char result[32];
char* edit_str = "C:\\usr\\local\\main.cpp";
strcpy(result,strrchr(edit_str,'\\')+1);
std::cout << '[' << result << ']' << std::endl;
}
>ファイルのパスを取得し、そこからファイル名だけを取得
>したいと考えてます。
_splitpath() / _makepath() を調べててみてください。
(環境が明記されていないので勝手にWindowsとする)
strstrやstrchrはWindows系のchar型配列で扱う文字列で使用する場合
文字コードがCP932(Shift_JIS)なので、「\」を検索するときに問題があります。
http://ja.wikipedia.org/wiki/Shift_JIS#2.E3.83.90.E3.82.A4.E3.83.88.E7.9B.AE.E3.81.8C5C16.E7.AD.89.E3.81.AB.E6.88.90.E3.82.8A.E3.81.86.E3.82.8B.E3.81.93.E3.81.A8.E3.81.AB.E3.82.88.E3.82.8B.E5.95.8F.E9.A1.8C
の「2バイト目が5C等に成りうることによる問題」を参考。
_mbsstr、_mbschr等のマルチバイト対応関数を使うか、
ん?さんからも指摘がある、パス分割関数_splitpathを使うか、
パス専用APIのPathFindFileNameAあたりを使うか、
そもそもUnicodeで処理するかどれかにしたほうが良いでしょう。
/*
PathFindFileName.cpp
Windows XP Pro sp3 , VC2005
マルチバイト、ユニコード、設定なし、どれでも良いみたい
*/
#include <windows.h>
#include <shlwapi.h> // link : shlwapi.lib
int main ( )
{
TCHAR Path [ ] = TEXT ( "C:\\user\\local\\main.cpp" ) ;
LPTSTR FileName = PathFindFileName ( Path ) ;
DWORD Written ;
LPCTSTR NewLine = TEXT ( "\r\n" ) ;
HANDLE hOutput = GetStdHandle ( STD_OUTPUT_HANDLE ) ;
WriteConsole ( hOutput, FileName, lstrlen ( FileName ), &Written, NULL ) ;
WriteConsole ( hOutput, NewLine, lstrlen ( NewLine ), &Written, NULL ) ;
system ( "pause" ) ;
return 0 ;
}
環境を言うのを忘れてしまいすいません。
WindowsXP、VCで作成しておりました。
>επιστημηさん
ありがとうございます。
その方法で上手く抜き出すことができました。
>ん?さん、Blueさん,かもねぎさん
ご指摘にあるとおり、標準関数ですと\の検索のとき
に文字コードで引っかかるようですね。
PathFindFileName();関数で取得をするように変更しました。
(かもねぎさんの例を参考にさせていただきました)
解決となりました。みなさんありがとうございました。
ツイート | ![]() |