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]をファイルに書き込んで、保存するプログラムを教えてください。
A 回答 (2件)
- 最新から表示
- 回答順に表示
No.2
- 回答日時:
バイナリとして書き出したいのなら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だけか、何らかの戻り値が必要か…はここだけでは判りませんけど。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 動かなくなってしまった古いVBAを動くようにしたい 8 2022/09/20 13:57
- Visual Basic(VBA) エクセルのマクロについて教えてください。 1 2023/02/21 11:19
- Excel(エクセル) エクセルのマクロについて教えてください。 2 2023/02/21 13:29
- CGI htmlからパラメータで、cgiに渡したい。 1 2023/02/06 16:15
- Excel(エクセル) エクセルのマクロについて教えてください。 1 2023/02/06 13:01
- Excel(エクセル) フォルダ内のワードファイルをPDFに一括変換するVBA 3 2023/06/09 16:51
- Visual Basic(VBA) 集めたシートのシート名を変更したい。 下記のコードでサブフォルダにあるファイルのSheet3を集めて 6 2022/08/23 10:38
- Visual Basic(VBA) VBAでファイル名を指定して保存するとき 4 2023/03/26 21:55
- Visual Basic(VBA) Excelのマクロコードについて教えてください。 1 2022/03/27 13:25
- Excel(エクセル) Excel VBAどこが間違ってますか? 4 2023/07/17 10:04
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
gccを行ってもexeファイルが生...
-
access テキストボックスの値取得
-
Access2013にてドラッグ&ドロ...
-
VBでファイルが開かれているか...
-
Adobeのプレミアプロの書き出し...
-
freadでデータがない場合の読込...
-
VB:「実行時エラー53 実行ファ...
-
エクセルVBAでパワーポイントを...
-
Returnに対するGoSubがありません
-
ADOを使用してExcelファイルを...
-
Request.BinaryReadでのエラー
-
アクセスのクエリでコンパイル...
-
FORTRANの実行エラーについて
-
VBから参照できないCのDLLを使...
-
ディストリビューションで作成...
-
Access2010 コンパイルエラー...
-
Dreamweaver3で「onLoad内で_on...
-
batファイルでレジストリキーの...
-
VC++2005 windowsフォームアプ...
-
CSVファイルが開かれているかど...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
gccを行ってもexeファイルが生...
-
VBでファイルが開かれているか...
-
「パス名が無効です」の発生原因
-
batファイルでレジストリキーの...
-
Returnに対するGoSubがありません
-
VBから参照できないCのDLLを使...
-
PowerShellを使って関連付けら...
-
アクセスのクエリでコンパイル...
-
VB6 Dir関数で52エラー発生
-
FTPの送信結果を検知したい
-
NAS上のファイルの使用中が解除...
-
VBA ExecuteExcel4Macro 型が一...
-
access テキストボックスの値取得
-
EXCELのVBAでWORDが開いてある...
-
すでにファイルが開かれている...
-
EXCELVBAでONEDRIVE上への保管...
-
Excelファイルのマクロによる排...
-
OUTLOOK VBA 指定フォルダ内の...
-
RAR圧縮ファイル(分割)の順番が...
-
エクセルマクロでエラーの原因...
おすすめ情報