- 締切済み
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]をファイルに書き込んで、保存するプログラムを教えてください。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- Wr5
- ベストアンサー率53% (2173/4061)
バイナリとして書き出したいのなら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だけか、何らかの戻り値が必要か…はここだけでは判りませんけど。
- zwi
- ベストアンサー率56% (730/1282)
ここに来るまでにfopenやらfprintfやらを使った経験は無いのでしょうか?