VC++6.0でCのコードを書いています。
絶対パスからのファイル名の切り出し方に関して質問です。
FILEPATH="C:\TEST\test.txt"
というファイルがあるとして
"C:\TEST"と"test.txt"の部分を切り離したいと思っています。
フォルダ位置は可変("C:\TEST\TEST"が来ることもある。)
このときに
FILEPATHの先頭アドレスから最後まで
\マークがいくつ来ているか判断して
最後の\マーク以降とそれ以前を
strcpyなどでコピーすればできると思うのですが、
この際、
1.\マークの数を数える
2.最後の\マークの手前までパス名をコピー
3.最後の\マーク以降をファイル名としてコピー
という作業が必要になると思いますが
もっと簡単に行う方法があればお教えいただければと思っています。
(標準関数を使用して・・・など)
よろしくお願いします。
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 */
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';
お探しの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も見ています
-
性格の違いは生まれた順番で決まる?長男長女・中間子・末っ子・一人っ子の性格の傾向
同じ環境で生まれ育っても、生まれ順で性格は違うものなのだろうか。家庭教育研究家の田宮由美さんに教えてもらった。
-
パスからファイル名を抽出
C言語・C++・C#
-
CString から LPCTSTRの型に変換
C言語・C++・C#
-
CStringからchar*への型変換について教えてください。
C言語・C++・C#
-
-
4
charからLPTSTRへの変換方法
C言語・C++・C#
-
5
CStringのFindで文字列検索を行いたいのですが
C言語・C++・C#
-
6
パスから最後のディレクトリだけを取得したいです
C言語・C++・C#
-
7
テキストボックスからフォーカス外す
C言語・C++・C#
-
8
ダイアログ表示時にチェックボックスにチェックされている状態にするには?
C言語・C++・C#
-
9
fopne で失敗する原因
C言語・C++・C#
-
10
ファイル名である文字列からbasenameを取得したい
C言語・C++・C#
-
11
C++初心者です。 debug assertion errorについて
C言語・C++・C#
-
12
char*を初期化したいのですが
C言語・C++・C#
-
13
実行ファイルのパスを取得したい
C言語・C++・C#
-
14
GetPrivateProfileStringでiniファイル読込む処理を詳しく知りたいのですが・・・
C言語・C++・C#
-
15
絶対パスの取得について
C言語・C++・C#
-
16
C++のfor文について
C言語・C++・C#
-
17
C++言語で、構造体のコピーは可能(しても良い)のでしょうか?
C言語・C++・C#
-
18
ファイル内のデータを1行削除する方法
C言語・C++・C#
-
19
ファイル出力の場所を指定
C言語・C++・C#
-
20
CFileDialogの最初のディレクトリ設定
C言語・C++・C#
関連するカテゴリから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桁区切(コンマ)記号をつけ...
-
絶対パスからのファイル名の切...
-
間接操作のレベルとは
-
間接参照のレベルが異なっています
-
型変換
おすすめ情報