みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

Win32API ファイルの書き込み、保存

Win32APIを使って、ファイルの保存ダイアログを表示→ファイルを指定→保存ボタンを押す→指定されたファイルに書き込む→指定したファイルを保存 というプログラムを作りたいと考えています。しかし、ファイルに書き込んだ後どう保存すればいいかわからないので教えてください。s[256]をfilename_fullに書き込んで保存したいです。この場合プログラムは抜粋したものなので、s[256]に文字が格納してあると考えてください。

char s[256];
FILE *fp;
static OPENFILENAME ofn;
static TCHAR filename_full[MAX_PATH];// ファイル名(フルパス)を受け取る領域
static TCHAR filename[MAX_PATH];// ファイル名を受け取る領域

// 構造体に情報をセット
ZeroMemory( &ofn, sizeof(ofn) ); // 最初にゼロクリアしておく
ofn.lStructSize = sizeof(ofn); // 構造体のサイズ
ofn.hwndOwner = hWnd; // コモンダイアログの親ウィンドウハンドル
ofn.lpstrFilter = _T("text(*.txt)\0*.txt\0All files(*.*)\0*.*\0\0"); // ファイルの種類
ofn.lpstrFile = filename_full; // 選択されたファイル名(フルパス)を受け取る変数のアドレス
ofn.lpstrFileTitle = filename; // 選択されたファイル名を受け取る変数のアドレス
ofn.nMaxFile = sizeof(filename_full); // lpstrFileに指定した変数のサイズ
ofn.nMaxFileTitle = sizeof(filename); // lpstrFileTitleに指定した変数のサイズ
ofn.Flags = OFN_OVERWRITEPROMPT; // フラグ指定
ofn.lpstrTitle = _T("名前を付けて保存");// コモンダイアログのキャプション
ofn.lpstrDefExt = _T("txt"); // デフォルトのファイルの種類

// 名前を付けて保存コモンダイアログを作成
if( !GetSaveFileName( &ofn ) )
{
MessageBox( hWnd, _T("エラー"), _T("エラー"), MB_OK );
SendMessage( hWnd, WM_CLOSE, 0, 0 );
}else{
if((fp=fopen(filename_full,"w")) == NULL) {
MessageBox( hWnd, _T("エラー"), _T("エラー"), MB_OK );
SendMessage( hWnd, WM_CLOSE, 0, 0 );
exit(0);/* (3)エラーの場合は通常、異常終了する */
}
/*ここからがわかりません*/
    /*s[256]をファイルに書き込んで、保存するプログラムを教えてください。

投稿日時 - 2012-06-23 13:10:08

QNo.7550140

すぐに回答ほしいです

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.2

Wr5

バイナリとして書き出したいのならfwrite()ですかね。
まぁfopen()はテキストモードでオープンしているようなのでfwrite()はふさわしくないかも知れませんが。


あと……GetSaveFileName()はWin32APIですが、fopen()はWin32APIというよりCの標準関数です。


掲示されたコードだと……
GetSaveFileName()でキャンセルしたりしたときにおかしなコトになってしまいますが…

>MessageBox( hWnd, _T("エラー"), _T("エラー"), MB_OK );
で、エラーを表示、
>SendMessage( hWnd, WM_CLOSE, 0, 0 );
で、おそらく自分自身のウィンドウを閉じるように指示して…
/*ここからがわかりません*/以降の処理に流れます。
そうすると、これから記述するであろうファイルアクセスの処理に入りますが、その時fpには何が入っているでしょうか?
# ということで、ほぼ確実にここで吹っ飛ぶ。

ファイルオープンに失敗したら……
>SendMessage( hWnd, WM_CLOSE, 0, 0 );
閉じるように指示して、
>exit(0);/* (3)エラーの場合は通常、異常終了する */
そのまま終了します。
# エラー終了ならプロセスの終了コードは0以外…が適当と思われますが。

おそらくイベントプロシージャでの記述でしょうから、そのまま抜けるのが適当ではないですか?
# 単にreturnだけか、何らかの戻り値が必要か…はここだけでは判りませんけど。

投稿日時 - 2012-06-23 14:07:10

ANo.1

zwi

ここに来るまでにfopenやらfprintfやらを使った経験は無いのでしょうか?

投稿日時 - 2012-06-23 13:49:22

あなたにオススメの質問