• ベストアンサー

特殊文字「\」の変換の方法

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 ); CString filepath; if( ReadDlg.DoModal() == IDOK ) { filepath = ReadDlg.GetPathName(); // ファイルのフルパス名を取得 } CFile cfile; CFileException ex; if( !cfile.Open( filepath, CFile::modeRead , &ex ) ) { AfxMessageBox( "ファイルを開くのに失敗しました" ); // エラーメッセージを表示 return; } char st[255] = ""; strcpy( st, filepath );

質問者が選んだベストアンサー

  • ベストアンサー
  • hegemon
  • ベストアンサー率72% (21/29)
回答No.2

>読込んだファイルパスの「\」を「\\」になるように変換したいのですが 単純にReplace()メソッドを呼ぶのでは駄目ですか? filepath.Replace("\\","\\\\");

その他の回答 (2)

  • BLK314
  • ベストアンサー率55% (84/152)
回答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()を呼ぶ必要があります。

zigen8513
質問者

お礼

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

  • MoguraSE
  • ベストアンサー率64% (81/126)
回答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

専門家に質問してみよう