重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

【解消】通知が届かない不具合について

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 );

A 回答 (3件)

>読込んだファイルパスの「\」を「\\」になるように変換したいのですが



単純にReplace()メソッドを呼ぶのでは駄目ですか?

filepath.Replace("\\","\\\\");
    • good
    • 0

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()を呼ぶ必要があります。
    • good
    • 0
この回答へのお礼

皆様ご回答ありがとうございます。
検討した結果、上記方法を用いて期待動作することを確認しました。
回答者の皆様ありがとうございました。

お礼日時:2009/05/16 20:33

こんにちは。



力技ですが、こんなコードはどうでしょうか。

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に変換後パスが格納される。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!