GetSaveFileName関数とC++のofstreamの関係について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ぬっち

GetSaveFileName関数とC++のofstreamの関係について

#1

投稿記事 by ぬっち » 15年前

こんばんは。
今回はWindows APIでファイルを保存する時のウインドウを開くためのGetSaveFileName関数と、C++でのファイル出力に使うofstreamの関係について質問させていただきます。

現在簡単なアプリケーションを作っていて、ファイルを出力するためのボタンを押すと保存先をWindows APIの関数であるGetSaveFileName関数を使ってファイルを指定した後、ファイルが保存されます。
ここまでは、問題ありません。
その次に、エラーの判断のためにログをファイルに保存する自作クラスで、ログを取ろうとすると実行ファイルからの相対パスではなくて、GetSaveFileName関数で指定したパスに保存されてしまいます。
なお、GetSaveFileName関数を呼び出す前は実行ファイルからの相対パスになっています。

流れとしては、
①log.txtとしてofstreamを使い、実行ファイルがあるところに作成する。(ここは問題なし)
例 : ofstream fout( TEXT( "log.txt" ), ios_base::app );
②GetSaveFileName関数を使い、出力するファイル(log.txtとは異なる)を指定(今はdata.bin)する。
③ofstreamを使い、②で得た出力するファイルのパスを使い、ファイルの出力が終了する。(ここも問題なし)
例 : ofstream fout( path );  //出力するファイルのパスをpathとしている。
④log.txtとしてofstreamを使い、ログを追加書き込みする。
例 : ofstream fout( TEXT( "log.txt" ), ios_base::app );
(ここで問題が生じ、data.binがある場所と同じ場所にlog.txtが作成される。)
となっています。

日本語のパスに対応するため、
setlocale( LC_ALL, "japanese" );
としています。

どなたかこれを解決する方法を教えていただけないでしょうか?
よろしくお願いします。

ぬっち

Re:GetSaveFileName関数とC++のofstreamの関係について

#2

投稿記事 by ぬっち » 15年前

すいません、自己解決しました。
もしかしたら今後この問題に悩んでしまう方がいらっしゃるかもしれませんので解決法を書いておきます。
GetSaveFileName関数はカレントディレクトリを実行ファイルがある場所から、GetSaveFileNameで指定した場所に暗黙のうちに変えてしまいます。
そこで、以下のようにOPENFILENAME構造体のフラグにOFN_NOCHANGEDIRを付け加えます。

OPENFILENAME ofn;
ZeroMemory( &ofn, sizeof( ofn ) );
//...(中略)...
ofn.Flags = OFN_OVERWRITEPROMPT | OFN_NOCHANGEDIR;
GetSaveFileName( &ofn );

すると、カレントディレクトリを変更しなくすることが出来ます。
お騒がせしてしまって申し訳ありませんでしたm(--)m

閉鎖

“C言語何でも質問掲示板” へ戻る