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

このQ&Aに関連する最新のQ&A

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に関連する人気のQ&A

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

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q半角文字はどれまでが特殊文字ですか?

こんにちは。

英語サイトを作成しようとしているのですが、
半角文字はどれまでが特殊文字だか分かりません。

下記のサイトを参考にしようとしましたが、アルファベットまで特殊文字に含まれています。
http://web-dou.com/html/t023b.html

<や、>などはもちろん認識しているのですが他のが分かりません。

どなたか、御教示願えないでしょうか?

以上、よろしくお願い申し上げます。

Aベストアンサー

#1 です。

HTML上で文字として表示したい場合は <>& をHTMLエンティティ化する必要があり、属性値として指定するなら <>&"' をHTMLエンティティ化する必要があります。

そして、指定した文字コード外の文字を表示したい場合にHTML文字実体参照、HTML文字数値参照が使われます。
UTF-8 文字コードを指定した場合は ISO/IEC 10646(UCS) で規定されている文字は全て使用できるということです。
あなたが指定する文字コードの文字セットを調べ、そこにない文字だけHTML文字実体参照/数値参照を指定してください。

一般に英語圏ならASCII文字を使用しているため、U+00000~U+000FFまでは使用できるはずです。
他の文字については私は知らない為、その時々で調べるか文字参照を使いますね。
&copy; は何となく文字参照を使いたくなりますが…。

# Re: shoshin01さん

Qchar *str; と char* str;

char *str; と char* str;
どっちも同じことを意味しているんですか?

Aベストアンサー

同じことを指している、というのは、先の回答の通りです。

また、ひとつの宣言で変数を複数宣言したときに、char* str という表記は間違い
易いじゃないか、ということが言われているのも事実です。実際、いろいろな C のソースを
見ていても、まずアスタリスクを型につけて書くのは、まずお目にかかれません。

ただ C++ では、char* str という宣言も良く使われています。

C++ に限らずオブジェクト指向の言語は、強く型を意識するので、「文字のポインタ型」と
いう意味で、まとめて書く方が馴染むのでしょう。ちなみにそういう風な人たちは

char *str1, *str2;

とは、書けない体になっています。

char* str1;
char* str2;


変数の宣言だと、C に慣れていれば、char* str というのはちょっと違和感があるのは
私も分かりますが、関数のプロトタイプ宣言だと、どちらの方がすっきりしますか?

extern char *memcpy(char *, const char *);

extern char* memcpy(char*, const char*);


# まあ、どっちが正しい、っていうんじゃ無いんですよね

同じことを指している、というのは、先の回答の通りです。

また、ひとつの宣言で変数を複数宣言したときに、char* str という表記は間違い
易いじゃないか、ということが言われているのも事実です。実際、いろいろな C のソースを
見ていても、まずアスタリスクを型につけて書くのは、まずお目にかかれません。

ただ C++ では、char* str という宣言も良く使われています。

C++ に限らずオブジェクト指向の言語は、強く型を意識するので、「文字のポインタ型」と
いう意味で、まとめて書く方が馴染む...続きを読む

Qサクラエディタで特殊文字ファイルを開きたい

サクラエディタで特殊文字があるファイルを開くと、違う文字で表示されてしまいます。

私が言っている特殊文字は外国のアルファベットの事で、
Aの上に丸がついたり、Cに尻尾みたいなのがついてたり(フランス語)する文字の事です。

Notepadで開くとちゃんと特殊文字で見れるのですが、
サクラで開くと普通のAやCで表示されてしまいます。

サクラではこのような文字は表示できないのでしょうか。
それとも何か設定があるのでしょうか。
よろしくお願いします。

Aベストアンサー

http://sakura.qp.land.to/?FAQ%2F5
Shift JISにない文字は扱えません。

QC言語でgetchar();が上手く使えずに困っています‼ void input(char *cx,

C言語でgetchar();が上手く使えずに困っています‼

void input(char *cx, char *cy){
int i,x,y;
printf("x=");
*cx = getchar();
if(*cx != 'q'){
for(i = 0; i < 5; i++)
if(*cx == '0' + i)x = i;
}

printf("¥ny=");
*cy = getchar();
if(*cy != 'q'){
for(i = 0; i < 5; i++)
if(*cy == '5' + i)y = i;
}
}

という関数で、一度目は上手く行くのですが、二度目の実行で*cy = getchar();が行われません。
cx,cyは、関数を呼び出す前に'9'を代入しています。

実行されない原因と改善策を教えて下さい‼

C言語でgetchar();が上手く使えずに困っています‼

void input(char *cx, char *cy){
int i,x,y;
printf("x=");
*cx = getchar();
if(*cx != 'q'){
for(i = 0; i < 5; i++)
if(*cx == '0' + i)x = i;
}

printf("¥ny=");
*cy = getchar();
if(*cy != 'q'){
for(i = 0; i < 5; i++)
if(*cy == '5' + i)y = i;
}
}

という関数で、一度目は上手く行くのですが...続きを読む

Aベストアンサー

ついでに言うと、
printf("x=")
のあとで
*cx = getchar();
がキー入力待ちになって見えるのは、たまたまこの時点で標準入力が空だからです。

例えば 432(エンター) と入力したなら、標準入力には
「4」 「3」「2」 「改行」
の4文字が入力され、
*cx = getchar(); で 「4」
*cy = getchar(); で(キー入力待ちにはならずに) 「3」
次に inputが呼ばれたときの
*cx = getchar(); で(キー入力待ちにはならずに) 「2」
*cy = getchar(); で(キー入力待ちにはならずに) 「改行」
となります。

QWord2007で、記号や特殊文字が選択できない。

Word2007の、記号と特殊文字>その他の記号>記号と特殊文字タブ にて、
一覧にある記号や特殊文字をクリックしても、カーソルが移動しません。
どうしたら直るでしょうか?

Aベストアンサー

crapeさん 今日は!
>Word2007の記号と特殊文字>その他の記号>記号と特殊文字タブで一
>覧にある記号や特殊文字をクリックしてもカーソルが移動しません。
「挿入」リボンの「記号と特殊文字」→「その他の記号」をクリックします。
記号と特殊文字」のダイアログが表示されるので「記号と特殊文字」タブ
フォント欄の▼マークで「Wingdings」を選択し希望の記号が無い時は右側の垂直スクロールバーで表示させ記号をクリックし、下部にある「挿入」ボタンをクリックすると文書の中に移動されます。
また最近使用していれば「細菌使用した記号」の一覧に表示されていますので同じよな操作で取り込めます。(IME言語バーからも選べます)
■[文字一覧]から絵文字を入力(OfficeIME2007)↓
http://hccweb1.bai.ne.jp/enjoy/point/point115.htm
内容:[IMEツールバー]を文字が入力できる状態(Wordやメモ帳を立ち上げ状態)にして赤枠(IMEパッド)をクリックします。
上の[IMEパッド]が表示されますので、左端の上から2番目[文字一覧]をクリックします。
他にもありますが、主に下の2種類[その他の記号]と[装飾記号]にたくさんの絵文字があります。

crapeさん 今日は!
>Word2007の記号と特殊文字>その他の記号>記号と特殊文字タブで一
>覧にある記号や特殊文字をクリックしてもカーソルが移動しません。
「挿入」リボンの「記号と特殊文字」→「その他の記号」をクリックします。
記号と特殊文字」のダイアログが表示されるので「記号と特殊文字」タブ
フォント欄の▼マークで「Wingdings」を選択し希望の記号が無い時は右側の垂直スクロールバーで表示させ記号をクリックし、下部にある「挿入」ボタンをクリックすると文書の中に移動されます。
また最近...続きを読む

Qchar *(*)[3];について

#include <iostream.h>
main(){
char *(*pp)[3];
printf("%lu", sizeof(char*));
printf(" pp%lu", pp);
printf(", ++pp%lu", ++pp);
}

これを実行して
4 pp6660000, ++pp???????
のように表示されたときに、???????の部分が何になるか考えました。
ppはchar[3]を指すポインタのポインタだから、ppをインクリメントすれば、「char[3]を指すポインタ」の大きさだけ大きくなるはずだから、「char[3]を指すポインタ」の大きさである4バイト大きくなるはずだから
4 pp6660000, ++pp6660004
になると思いました。
どこを勘違いしていてどう考え直せばよいか教えて下さい。

Aベストアンサー

pp は、3コのポインタの配列へのポインタです。
ポインタのサイズが4バイトの時、
pp をインクリメントすると12バイト増えることになります。

例えば、次の様に書くとわかりやすいと思います。
#include <cstdio>

using namespace std;
// CHAR3 は、3のサイズを持つchar の配列
typedef char CHAR3[3];

int main(){
CHAR3 *pc3;//pc3 は、char[3]を指すポインタ
char test[3];
pc3=&test;
printf("%p\n",pc3);
pc3++;
printf("%p\n",pc3);//+3(サイズ分)される

CHAR3 **ppc3;//ppc3 は、char[3]を指すポインタのポインタ
ppc3=&pc3;
printf("%p\n",ppc3);
ppc3++;
printf("%p\n",ppc3);//+4(ポインタサイズ分)される

return 0;
}

pp は、3コのポインタの配列へのポインタです。
ポインタのサイズが4バイトの時、
pp をインクリメントすると12バイト増えることになります。

例えば、次の様に書くとわかりやすいと思います。
#include <cstdio>

using namespace std;
// CHAR3 は、3のサイズを持つchar の配列
typedef char CHAR3[3];

int main(){
CHAR3 *pc3;//pc3 は、char[3]を指すポインタ
char test[3];
pc3=&test;
printf("%p\n",pc3);
pc3++;
printf("%p\n",pc3);//+3(サイズ分)される

CHAR3 **ppc3;//p...続きを読む

Q特殊文字の呼び方、画面の出し方を教えてください

至急、知りたいのですがアルファベットの「R」を反対向けた(鏡に映したような文字)なのですが特殊文字でしょうか?
入力して出すときにはどのように出せばいいのでしょうか?
初心者です。出来れば分かり易い簡単な方法を教えてください。

Aベストアンサー

Я ですか
もしIMEを使用しているなら「きごう」と入力して変換すれば出てきます。ATOKなら「きごう」と入力してShift+F6で変換します。

Qchar c = 'a'; char h[1] = c; エラー

char型のものを char[]型に代入したいです。

char c = 'a';
char h[1] = c;

として、

h[0] は \x97
h[1] は \x00

にしたいです。
型変換の方法を教えてください。

Aベストアンサー

とりあえず、確認を。

C では、'a'の表す値は 0x61 = 97 であって、 \x97 ではないと思います。
(\xnnn を、十六進数の意味に取りましたが、あってますでしょうか?
この場合、C では通常 0xnnn のように書くと思います。)
ので、 これは 0x61 のことをおっしゃっていると仮定します。

> char h[1] = c;
っと、これではたぶんコンパイルが通りません。

char h[1] = {c};

のように、配列であることを明示して代入してください。
この式では、前半でh という名前の、*長さ1 の* char の配列変数を確保します。
後半で、その中を初期化しています。
添え字は 0 からはじまるので、この場合、h[0] に c の内容が代入されます。
1個しか場所を確保していないので、 h[1] の位置のデータは内容が不定です。
文字列として h を扱いたいのであれば、 C の文字列には終端として 0 が必要ですから、
char c = 'a';
char h[2] = { c, '\0'};

のような書き方が必要になります。
これで、お望みのデータになると思います。

とりあえず、確認を。

C では、'a'の表す値は 0x61 = 97 であって、 \x97 ではないと思います。
(\xnnn を、十六進数の意味に取りましたが、あってますでしょうか?
この場合、C では通常 0xnnn のように書くと思います。)
ので、 これは 0x61 のことをおっしゃっていると仮定します。

> char h[1] = c;
っと、これではたぶんコンパイルが通りません。

char h[1] = {c};

のように、配列であることを明示して代入してください。
この式では、前半でh という名前の、*長さ1 の* char の配列変数...続きを読む

Q特殊文字を表示させるには

アルファベットの「a」の上に小さく「・・」がついた特殊文字 - ドイツ語ででてきます - を表示するにはどうしたらよいでしょうか。文字パレットに入っているのですが、選択しても「□」と表示されるだけです。よろしくお願いします。

使用機種はPower Mac G4 1.25GHzです。

Aベストアンサー

欧文フォントを使用できるアプリケーション上なら、好きな欧文フォ
ントでoption+uの後にaでオッケーです。そういや以前に「フォント
は欧文フォントにしたんだけどスクリプトが日本語のままで失敗」し
た人がいるので念を押しますが、上記は欧文スクリプトでU.S.キー配
列の場合です。ドイツ語のキー配列なんて必要ありません。U.S.配列
だってアクセント記号は使えます。
いにしえのsystem6.0.4からMacOS X 10.2.4まで共通です。
ただし、日本語を前提とした掲示板などには使用できません。特に
EUC-JPやShift-JISの場合はアクセント記号付きアルファベットは日
本語文字コードの一部と重なりますので文字化けます。

Q「char* p」と「char *p」は何が違うのでしょうか

「char* p」と「char *p」の違いを教えてください。

Aベストアンサー

同じ意味です。
ただ、
char* p, q;
と書いた場合、一見char*型のpとqを定義しているように見えるかもしれません。
しかし、実際はchar*型のpとchar型のqを定義しています。
意図とは違うことが起きるかもしれません。

したがって、私は、型名の最後ではなく変数名の頭に*を付ける
書き方を採用しています。


人気Q&Aランキング

おすすめ情報