読者です 読者をやめる 読者になる 読者になる

Aoi #15 エディットボックスのテキストをファイルに書き込む

Application

エディットボックスのテキストを特定のファイルに書き込もうと思う・・・。
今回は、"test1.txt"にShift_JISで書き込む・・・。

f:id:BG1:20170202103037p:plain

すべてのファイル系クラスの基底クラスはCBinaryFileとするので、BinaryFile.hを追加・・・。
(すべてのファイルはバイナリファイルだし・・・。)

メンバ変数は、ファイル名配列m_tszFileName、ファイルハンドルm_hFile、バイナリデータ列へのポインタm_pByte・・・。
メンバ関数は、コンストラクタ、デストラクタ、Open、Close、Write・・・。

コンストラクタでNULL埋めたり、配列はZeroMemoryで埋めたり・・・。
デストラクタは解放処理(あ、配列もZeroMemoryするの忘れてた・・・。)

Openには、ファイル名lpctszFileName、アクセス方法dwDesiredAccess、ファイル作成についてのフラグdwCreationDispositionを指定・・・。
ファイル名はメンバm_tszFileNameにセット・・・。あとは、WindowsAPIのCreateFileを呼ぶ・・・。

Closeは引数なしで、WindowsAPIのCloseHandleを呼ぶ・・・。

Writeは書き込むバイナリデータ列と書き込むバイト数を指定・・・。
バイナリデータ列はバッファを外部に持っている場合に指定するもので、CBinaryFileにあるバッファを使う場合は別のメソッドを作るかも・・・。
WindowsAPIのWriteFileは書き込めたバイト数を格納する変数がいるので、とりあえずはローカル変数のdwBytesに入れてるが、あとで変更するかも・・・。

で、MainMenuBar.cppは、

pMainWindow->m_pEditBox->m_ptszTextはTCHARだが、CBinaryFileはバイト列で書き込むので変換しないといけない・・・。
特にShift-JISで書き込むので、文字コード変換が必要・・・。
WideCharToMultiByteの1回目は、変換先のバッファのサイズを計算するだけ・・・。
得られたサイズからchar型バッファpBufを確保・・・。
WideCharToMultiByteの2回目で、pBufに変換後の文字列が入る・・・。

そしたら、CBinaryFileオブジェクトを生成して、"test1.txt"をOpen・・・。
書き込みなのでGENERIC_WRITE、ファイルが無かったら作るのでOPEN_ALWAYS・・・。
WriteでpBufを書き込む・・・。
NULL文字の分は書かなくていいので、iMultiByteLen - 1・・・。
Closeで閉じる・・・。
そのあと、pBufとpBinaryFileをdelete・・・。

f:id:BG1:20170202105910p:plain

"あいうえお"を入力・・・。

f:id:BG1:20170202105937p:plain

"名前を付けて保存"を選択・・・。

f:id:BG1:20170202110132p:plain

デバッガで起動して相対パスだと、プロジェクトファイルのとこにできてしまうのだが、まあとりあえずファイルはできている・・・。

f:id:BG1:20170202110242p:plain

メモ帳で開くと、保存されてる・・・。

・エディットボックスのテキストをファイルに書き込む · bg1bgst333/Aoi@fe0f9c5 · GitHub