
VC++2005のMFCにてプログラムを作成しています。
CFileDialogにてテキストファイルを読み込み、
読込んだファイルパスの「\」を「\\」になるように変換したいのですが、
実装の方法が分かりません。
=====================================
例)C:\test\hoge.txt
⇒ C:\\test\\hoge.txt と変換する。
=====================================
下記にファイルパスをCstring型で読み込み、
char型に変換するまでのプログラムを記載します。
理想としては、char型配列の中に、
「C:\\test\\hoge.txt」のような変換後のファイルパスを
入れたいのです。
解決方法をご存知の方おられましたら、ご教示お願いできませんでしょうか。
【プログラム】
/* ファイルオープンダイアログを表示 */
CFileDialog ReadDlg( TRUE, NULL, "*.txt", OFN_HIDEREADONLY | OFN_FILEMUSTEXIST,
"txtファイル(*.txt)", this );
CStringfilepath;
if( ReadDlg.DoModal() == IDOK )
{
filepath = ReadDlg.GetPathName();// ファイルのフルパス名を取得
}
CFile cfile;
CFileExceptionex;
if( !cfile.Open( filepath, CFile::modeRead , &ex ) )
{
AfxMessageBox( "ファイルを開くのに失敗しました" );// エラーメッセージを表示
return;
}
char st[255] = "";
strcpy( st, filepath );
No.2ベストアンサー
- 回答日時:
>読込んだファイルパスの「\」を「\\」になるように変換したいのですが
単純にReplace()メソッドを呼ぶのでは駄目ですか?
filepath.Replace("\\","\\\\");
No.3
- 回答日時:
MFCなので、単純にCString::Replace()を使えばOKです。
CString s1("c:\\test1\\表1.xls");
s1.Replace("\\", "\\\\");
TRACE ("%s\n", (LPCTSTR)s1);
こんな感じです。
下手に自力でコーディングすると’表'とかの文字で文字化けします。
’表'の1バイト目が'\'と同じコードのため、誤動作します。
(SHIFT-JISの場合)
'\'やフォルダ、ファイル名などを
(日本語Windows系で)扱うとき、
1バイトずつループするのは、
(少なくともCの経験者や専門家の間では)
御法度なので、注意しましょう。
私も、初心者の頃はよくやってしまいました(笑)
MFCであればCStringが吸収してくれるので
(char配列でなく)こちらを採用すべきです。
CStringはLPCSTR等をとる関数には
そのまま(キャストなしで)渡せます。
(暗黙のうちに変換されます)
ただし、printf()等はパラメータのチェックを行わない関数の場合には
明示的にキャストしなければなりません。
なお、関数内で文字列を変更する等の理由で
(LPCTSTRでなく)char*が指定されている場合には
一旦,CString::GetBuffer()でポインタを取り出し、
使用が終わった時点で
CString::ReleaseBuffer()を呼ぶ必要があります。
皆様ご回答ありがとうございます。
検討した結果、上記方法を用いて期待動作することを確認しました。
回答者の皆様ありがとうございました。
No.1
- 回答日時:
こんにちは。
力技ですが、こんなコードはどうでしょうか。
void ConvPath(char *r,const char *s)
{
int i,l,p;
p = 0;
l = lstrlen(s);
for(i = 0;i < l;i++){
if(s[i] == '\\'){
r[p++] = '\\';
}
r[p++] = s[i];
r[p] = '\0';
}
}
ConvPath()は、パス文字列の中にある\を\\に変えることが出来る関数です。(今作ったので、動作未確認です;)
rは、変換処理後の文字列を格納する変数です。十分な長さの char* 型を与えてください。
sは、変換処理前の文字列が入った変数です。NULL文字で終端しておいてください。
例:
char before[MAX_PATH],after[MAX_PATH];
lstrcpy(before,"C:\test\hoge.txt");
StrConv(after,before); // これでafterに変換後パスが格納される。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
特殊文字「\\」の変換の方法
-
エクセルVBAで「〜」が表現でき...
-
"\\n"を"<br>"にうまく変換でき...
-
substring バイト単位でやりたい
-
文字化けします。
-
数字のみにしたい
-
秒数(Long)→HH:mm:ssへの変換...
-
Path型をString型へ変換する(Java)
-
javaで質問です。 文字列2023/2...
-
IBM漢字コード⇒SJIS変換方法
-
javascriptで文字列のsjis利用...
-
int型のゼロ埋め
-
オブジェクトの中のプロパティ...
-
Log4jで機能毎に別ファイルへ出...
-
JSPやサーブレットでSystem.out...
-
動的配列が存在(要素が有る)か...
-
IF関数でEmpty値を設定する方法。
-
ORA-01858: 数値を指定する箇所...
-
ループ処理の際、最後だけ","を...
-
System.err. printlnとSystem.o...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
javaで質問です。 文字列2023/2...
-
ダブルクォーテーションのrepla...
-
javascriptで文字列のsjis利用...
-
int型のゼロ埋め
-
javaの初歩的な質問です。
-
Path型をString型へ変換する(Java)
-
C言語32bitから64bitの移行につ...
-
JavaのStringクラスに「外字」...
-
エクセルVBAで「〜」が表現でき...
-
カタカナの「ソ」以降の文字が...
-
Windows-31Jからutf-8への変換...
-
pasteHTMLでパスが勝手に変換さ...
-
DBから取得したデータの文字化け
-
数字のみにしたい
-
Visual Basic でのコードをASCI...
-
ジェネリックのキャストをした...
-
補数について質問
-
publicがprotectedになった場合...
-
error C2440: 'static_cast' : ...
-
文字を整数(int)に変換
おすすめ情報