VC++6.0でCのコードを書いています。
絶対パスからのファイル名の切り出し方に関して質問です。
FILEPATH="C:\TEST\test.txt"
というファイルがあるとして
"C:\TEST"と"test.txt"の部分を切り離したいと思っています。
フォルダ位置は可変("C:\TEST\TEST"が来ることもある。)
このときに
FILEPATHの先頭アドレスから最後まで
\マークがいくつ来ているか判断して
最後の\マーク以降とそれ以前を
strcpyなどでコピーすればできると思うのですが、
この際、
1.\マークの数を数える
2.最後の\マークの手前までパス名をコピー
3.最後の\マーク以降をファイル名としてコピー
という作業が必要になると思いますが
もっと簡単に行う方法があればお教えいただければと思っています。
(標準関数を使用して・・・など)
よろしくお願いします。
No.2ベストアンサー
- 回答日時:
_splitpath 関数を使用すれば簡単だと思います。
サンプルを示せば、こんな感じです。(見にくいですが)
#include <stdlib.h>
char path[_MAX_PATH]; /* _MAX_PATH260 */
char drive[_MAX_DRIVE]; /* _MAX_DRIVE 3 */
char dir[_MAX_DIR]; /* _MAX_DIR256 */
char name[_MAX_FNAME]; /* _MAX_FNAME256 */
char ext[_MAX_EXT]; /* _MAX_EXT256 */
_splitpath("C:\TEST\test.txt", drive, dir, name, ext);
_makepath(path, drive, dir, NULL, ext); /* C:\TEST\ */
_makepath(path2, NULL, NULL, name, NULL); /* test.txt */
C:\TEST\の後ろの\をカットしたい場合は、下記を追加して下さい。
int len;
len = strlen(path);
if (path[len-1] != '\\')path[len-1] = '\0';
No.7
- 回答日時:
if (path1[len-1] == '\\')という判定に問題があると思います。
int main(){
int len;
char path1[30] = "c:\\aaa\\ピカソ";
len = strlen(path1);
if (path1[len-1] == '\\') path1[len-1] = '\0';
printf(path1);//←「c:\aaa\ピカ」になってしまいます。
return 0;
}
おっしゃる通り_makepathではpathに必ず円マークを返すので
問題無いようでした。すみません。
ただ
if (path1[len-1] == '\\')
この判定は不要だと思います。
あと_makepathや_spiltpathはCの標準関数ではありません。
当然ですがUNIX系ではコンパイル自体
通らなくなります。
※MSDNの必要条件の欄に各関数がC標準かどうかが
書かれています。
No.6
- 回答日時:
#5さんが指摘されている0x5c(\)問題。
何故か_splitpath関数で問題なく切り出す事が出来ますが…。
strrchr関数による切り出しなら問題が有るのは理解できますが。
問題が有るのなら#2~の回答は取り消して下さい。
このスレッドを汚してしまい、何度もすみません。
【0x5c(\)を含む全角文字列のテスト】
char test1[]="c:\\aaa\\ピカソ";
char test2[]="c:\\aaa\\ピカソ\\能力.txt";
_splitpath(test1, drive, dir, name, ext);
_makepath(path1, drive, dir, NULL, NULL); /* c:\\aaa\ */
_makepath(path2, NULL, NULL, name, ext); /* ピカソ */
len = strlen(path1);
if (path1[len-1] == '\\') path1[len-1] = '\0'; /* c:\\aaa */
_splitpath(test2, drive, dir, name, ext);
_makepath(path1, drive, dir, NULL, NULL); /* c:\aaa\ピカソ\ */
_makepath(path2, NULL, NULL, name, ext); /* 能力.txt */
len = strlen(path1);
if (path1[len-1] == '\\') path1[len-1] = '\0'; /* c:\aaa\ピカソ */
No.5
- 回答日時:
SJISコードの場合フォルダ名に
「ソ」や「申」、「十」等の
下位バイトに0x5C(\:円マークと同じコード)
が含まれるとそれに反応してしまうので注意してください。
※例えば「c:\aaa\ピカソ」というパスに対しては
#1さんや#2さんのコードでは
意図した結果になりません。
char path[30] = "c:\\aaa\\ピカソ";
char* b = strrchr(path,'\\');
if (b){
*b = '\0';
printf(path); ←「c:\aaa\ピカ」になってしまいます。
}
もし扱うコードがSJISでフォルダに全角文字が含まれる可能性があるなら
基本的に前方から検索する必要があります。
#include "stdio.h"
#include "string.h"
int main()
{
int i,nlast,nlen;
char FILENAME[30];
char FILEPATH[30]="C:\\TEST\\test.txt";
nlen = strlen(FILEPATH);
nlast = -1;
for( i = 0 ; i < nlen ; i++ ){
if( FILEPATH[i] < 0 ){
i++;
continue;
}
if (FILEPATH[i] == '\\'){
nlast = i;
}
}
if (nlast != -1){
strcpy(FILENAME,FILEPATH+nlast+1);
printf("ファイル名=%s\n",FILENAME);
*(FILEPATH+nlast) = '\0';
printf("パス=%s\n",FILEPATH);
}
return 0;
}
No.4
- 回答日時:
#2,#3です。
まだ間違いが有りました。本当に申し訳ありません。(寝ぼけて…)
int len;
len = strlen(path);
if (path[len-1] == '\\')path[len-1] = '\0';
No.3
- 回答日時:
#2です。
間違いがありましたので訂正します。すみませんでした。
_makepath(path, drive, dir, NULL, NULL); /* C:\TEST\ */
_makepath(path2, NULL, NULL, name, ext); /* test.txt */
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) フォルダ内のエクセルファイルを開かずにデータ採取する関数式 2 2022/12/22 22:15
- Visual Basic(VBA) サブフォルダ(データ)にある複数の.xlsxファイルのSheet3のA2セルの値で01から左側をB2 2 2022/08/14 15:46
- Excel(エクセル) 【マクロ】同じフォルダ内にある複数ブックから1つのブック内の1シートにデータを集めたい 6 2022/09/28 18:16
- Visual Basic(VBA) 集めたシートのシート名を変更したい。 下記のコードでサブフォルダにあるファイルのSheet3を集めて 6 2022/08/23 10:38
- Visual Basic(VBA) エクセルのマクロについて教えてください。 1 2023/08/10 11:34
- Visual Basic(VBA) VBAでファイル名を指定して保存するとき 4 2023/03/26 21:55
- Visual Basic(VBA) エクセルのマクロについて教えてください。 1 2023/08/08 11:02
- JavaScript [再掲]指定したパスが現URLに含まれていたら特定要素を削除するJavascriptのコードについて 1 2023/05/10 15:09
- Visual Basic(VBA) VBA GetAttrについて教えてください 2 2022/12/22 15:25
- その他(プログラミング・Web制作) VScodeでpythonプログラムの関数を実行したい 2 2022/07/13 19:24
このQ&Aを見た人はこんなQ&Aも見ています
-
プロが教えるわが家の防犯対策術!
ホームセキュリティのプロが、家庭の防犯対策を真剣に考える 2組のご夫婦へ実際の防犯対策術をご紹介!どうすれば家と家族を守れるのかを教えます!
-
パスから最後のディレクトリだけを取得したいです
C言語・C++・C#
-
CStringからchar*への型変換について教えてください。
C言語・C++・C#
-
charからLPTSTRへの変換方法
C言語・C++・C#
-
-
4
CStringのFindで文字列検索を行いたいのですが
C言語・C++・C#
-
5
パスからファイル名を抽出
C言語・C++・C#
-
6
CString から LPCTSTRの型に変換
C言語・C++・C#
-
7
テキストボックスからフォーカス外す
C言語・C++・C#
-
8
fopne で失敗する原因
C言語・C++・C#
-
9
ファイル名である文字列からbasenameを取得したい
C言語・C++・C#
-
10
GetPrivateProfileStringでiniファイル読込む処理を詳しく知りたいのですが・・・
C言語・C++・C#
-
11
ファイルやディレクトリの存在確認を行う方法
C言語・C++・C#
-
12
C++初心者です。 debug assertion errorについて
C言語・C++・C#
-
13
ダイアログ表示時にチェックボックスにチェックされている状態にするには?
C言語・C++・C#
-
14
画面を強制的に再描画させる方法
C言語・C++・C#
-
15
char*を初期化したいのですが
C言語・C++・C#
-
16
実行ファイルのパスを取得したい
C言語・C++・C#
-
17
fopenで別ディレクトリにファイルをオープンしたい
C言語・C++・C#
-
18
文字列の置換をCStringで(C++)
C言語・C++・C#
-
19
絶対パスの取得について
C言語・C++・C#
-
20
ファイル出力の場所を指定
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
fgetsなどのときのstdinのバッ...
-
ftoa の作り方
-
C言語のfor文です。 繰り返しの...
-
エンディアン:2バイトのデー...
-
絶対パスからのファイル名の切...
-
テキストデータをそのままバイ...
-
charでの計算?
-
strtol関数 自作
-
C言語の入力した文字を反転させ...
-
3桁区切(コンマ)記号をつけ...
-
「ポインタのポインタ」を使っ...
-
【C言語】文字型と整数型の違い
-
コマンドラインに入力されてい...
-
c言語配列の結合についてです。...
-
配列をnビットシフトする
-
str系関数を使わずに二つの文字...
-
【C言語】構造体内の領域解放(...
-
文字列から空白を取り除きたい...
-
atoi( ) の反対をやりたい
-
OpenCVで32bit ヘッダ無しRaw画...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
charからLPTSTRへの変換方法
-
charでの計算?
-
配列をnビットシフトする
-
'const char *' 型は 'char *' ...
-
型変換
-
テキストデータをそのままバイ...
-
文字列から空白を取り除きたい...
-
CStringをwchar_tに変換したい
-
絶対パスからのファイル名の切...
-
fgetsなどのときのstdinのバッ...
-
ネットワークにつながっている...
-
str系関数を使わずに二つの文字...
-
3桁区切(コンマ)記号をつけ...
-
atoi( ) の反対をやりたい
-
double型の値をchar配列に変換...
-
C言語のfor文です。 繰り返しの...
-
switch文で文字を比較すること...
-
ファイル名である文字列からbas...
-
c++ 文字列を入力して、一文字...
-
strncpyと_tcsncpy_sのヌルの扱...
おすすめ情報