- ベストアンサー
fopenでのパス指定
毎度お世話になります。 ただ今VS2005でWindowsアプリケーションの実装を行っています。 fopenでパス指定をしてファイルを開くとき、 fopen("C:\\Test\\data.txt", w); としますが、GetModuleFileNameで取得したパス↓ GetModuleFileName(NULL, szPath, sizeof(szPath)); を使用したいとき、単に fopen(szPath, w); ではできません。これはszPathの中身が C:\Test\data.txt となっているためにfopenでは開けないんだと思うのですが、 わざわざszPathの文字を1文字づつ見ていって、 "\"があったときに"\"を付け足す… という作業をしなければならないのでしょうか。 他に解決策があるのでしょうか。 ご教授お願いします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
C:\\Test\\data.txt のようにする必要があるのは、#2さんの指摘のようにソースコード上で直接記述する場合だけです。 なので、既にszPathの内容が C:\Test\data.txt であれば、そのままfopenに渡せばよいです。
その他の回答 (3)
- titokani
- ベストアンサー率19% (341/1726)
まずは中身をTRACE等で確認しましょう。 TRACE("%s\n",szPath); と、書くと、VCの出力ウィンドウにszPathの中身が表示されます。
お礼
szPathの中身を確認したところ、 C:\Test\data.exe のようになっていました。 勉強不足でごめんなさい。 下記にもご指摘いただいたため、これから "data.exe"を取り除き、"data.txt"を結合いたしました。 よって今の段階ではszPathの中身は C:\Test\data.txt のようになっています。 ご指摘ありがとうございました。 これからfopenを行うためには、 C:\\Test\\data.txt と指定しなければなりませんよね。 "\"を"\\"と書き換えるには何か関数があるのでしょうか。 このお礼の場で質問してしまいごめんなさい。
- jgk
- ベストアンサー率75% (104/138)
ソースコード上では\はエスケープシーケンスの開始文字のため、 \自体を使いたい場合、\\と表記する必要があるだけで、 実際に格納されるののは\だけです。 GetModuleFileNameは、実行ファイルのパスを取得するもので、 実行ファイルと同じフォルダのdata.txtを開きたいならば、 GetModuleFileNameの結果から実行ファイルの名前を取り除き、 data.txtを連結する必要がありますがその辺は大丈夫でしょうか? (VC++であれば_splitpath、_makepathで処理してしまうのが楽かなと思います)
お礼
どうも、迅速なご回答ありがとうございます。 先ほど、GetModuleFileNameで取得したパス名から、 _splitpath、_makepathを使ってexeファイルを取り除き、 data.txtを連結することができました。 関数を教えて頂き感謝します。
- reset_cat
- ベストアンサー率68% (94/138)
まず、以下の関数ですが、 >GetModuleFileName(NULL, szPath, sizeof(szPath)); これは「現在のプロセスを作成するために使われたファイルのパス」が取得できます。要するに今実行しているexeファイル名です。 そのexeファイルに、 >fopen(szPath, w); で書き込みオープンしようとしているわけで、まず失敗すると思います。 やりたいことは、exeと同じパスのdata.txt(仮)をオープンしたいのでしょうか?
お礼
とても迅速なご回答、ありがとうございます。 なるほど。 GetModuleFileNameでは.exeまでを取得するのですね。 勉強不足でごめんなさい。 はい。 私のやりたいことは、exeと同じフォルダにdata.txtをオープンしたいのです。取得したパス名の"\"を"\\"と書き換えてfopenするべきですよね。
お礼
ご無沙汰しております。 やりたい内容ができましたので報告させていただきます。 szPathの内容は"\\"のように変更せずともそのまま fopenに渡せばできるのですね。 勉強不足でごめんなさい。 ありがとうございました。