MFCでテキストの読み込み&出力 3

前回までの記事

テキスト出力処理

さて、最後に出力処理を行います。

こっちは簡単です。

読込処理で作った処理をだいぶ流用します。

一気に出力処理まで書きました。

void CTextInputOutputDlg::OnBnClickedButtonOutput()
{
	// ここはテキスト出力処理

	CString strTitle = _T("テキスト出力処理タイトル");
	static char BASED_CODE szFilter[] = "テキストドキュメント|*.txt|";

	CFileDialog dlgFile(FALSE, "*.txt", NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, szFilter);
	dlgFile.m_ofn.lpstrTitle = strTitle;	// タイトル設定

	// ファイルダイアログの表示
	INT_PTR iRetFileDlg = dlgFile.DoModal();
	if (iRetFileDlg == IDOK)
	{
		// 保存ボタンが押下された
		CString strPath = dlgFile.GetPathName();	//ファイルのパス

		// エディットボックス内のテキスト取得
		CString strText = _T("");
		GetDlgItemText(IDC_EDIT_TEXT, strText);

		CStdioFile* pStdioFile = new CStdioFile(strPath, (CFile::modeWrite | CFile::modeCreate));
		pStdioFile->Seek(0, CFile::end);
		pStdioFile->WriteString(strText);
		delete pStdioFile;
		pStdioFile = NULL;
	}
	else
	{
		// キャンセルボタンが押下された
	}
}

強いて言えば、CStdioFileの箇所ですかね。

なんとなくわかると思いますが、WriteStringで書き込みができます。

読込処理に比べて出力処理は簡単に作成できました。

世の中、一方向は簡単だけど、逆方向が難しいってのよくありますよね。

簡単

  • 川の流れる方向へ泳ぐ
  • 山を下る
  • 式の展開
  • 微分

難しい

  • 川の流れと逆方向に泳ぐ
  • 山を登る
  • 因数分解
  • 積分

ばかなこと書いてないで、さっさとビルドしましょう(((((((((((っ・ω・)っ

テキスト出力してみます。

今回出力するテキストはこれ。

出力ボタンを押すと

保存ダイアログが出てきました。

ファイル名を「出力テスト」にして保存ボタンを押します。

出来上がったテキストファイルを開くと…

出力できてます。

終わりに

今回、簡単なテキストの読込処理と出力処理をMFCで作ってみました。

実はたまーに、自作アプリ作るときにテキストの読み込みや出力を入れたくて、
そのたび前作った処理ってどう書いてたっけなーって調べるのが面倒だったので、
どちらかというとメモ的な感じで残しました。

最後に、今回作成したTextInputOutputDlg.cppのコードだけ載せて終わります。


// TextInputOutputDlg.cpp : 実装ファイル
//

#include "pch.h"
#include "framework.h"
#include "TextInputOutput.h"
#include "TextInputOutputDlg.h"
#include "afxdialogex.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif


// アプリケーションのバージョン情報に使われる CAboutDlg ダイアログ

class CAboutDlg : public CDialogEx
{
public:
	CAboutDlg();

// ダイアログ データ
#ifdef AFX_DESIGN_TIME
	enum { IDD = IDD_ABOUTBOX };
#endif

	protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV サポート

// 実装
protected:
	DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialogEx(IDD_ABOUTBOX)
{
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialogEx::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
END_MESSAGE_MAP()


// CTextInputOutputDlg ダイアログ



CTextInputOutputDlg::CTextInputOutputDlg(CWnd* pParent /*=nullptr*/)
	: CDialogEx(IDD_TEXTINPUTOUTPUT_DIALOG, pParent)
{
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CTextInputOutputDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialogEx::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CTextInputOutputDlg, CDialogEx)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_BN_CLICKED(IDC_BUTTON_INPUT, &CTextInputOutputDlg::OnBnClickedButtonInput)
	ON_BN_CLICKED(IDC_BUTTON_OUTPUT, &CTextInputOutputDlg::OnBnClickedButtonOutput)
END_MESSAGE_MAP()


// CTextInputOutputDlg メッセージ ハンドラー

BOOL CTextInputOutputDlg::OnInitDialog()
{
	CDialogEx::OnInitDialog();

	// "バージョン情報..." メニューをシステム メニューに追加します。

	// IDM_ABOUTBOX は、システム コマンドの範囲内になければなりません。
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
	ASSERT(IDM_ABOUTBOX < 0xF000);

	CMenu* pSysMenu = GetSystemMenu(FALSE);
	if (pSysMenu != nullptr)
	{
		BOOL bNameValid;
		CString strAboutMenu;
		bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
		ASSERT(bNameValid);
		if (!strAboutMenu.IsEmpty())
		{
			pSysMenu->AppendMenu(MF_SEPARATOR);
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
		}
	}

	// このダイアログのアイコンを設定します。アプリケーションのメイン ウィンドウがダイアログでない場合、
	//  Framework は、この設定を自動的に行います。
	SetIcon(m_hIcon, TRUE);			// 大きいアイコンの設定
	SetIcon(m_hIcon, FALSE);		// 小さいアイコンの設定

	// TODO: 初期化をここに追加します。

	return TRUE;  // フォーカスをコントロールに設定した場合を除き、TRUE を返します。
}

void CTextInputOutputDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
	if ((nID & 0xFFF0) == IDM_ABOUTBOX)
	{
		CAboutDlg dlgAbout;
		dlgAbout.DoModal();
	}
	else
	{
		CDialogEx::OnSysCommand(nID, lParam);
	}
}

// ダイアログに最小化ボタンを追加する場合、アイコンを描画するための
//  下のコードが必要です。ドキュメント/ビュー モデルを使う MFC アプリケーションの場合、
//  これは、Framework によって自動的に設定されます。

void CTextInputOutputDlg::OnPaint()
{
	if (IsIconic())
	{
		CPaintDC dc(this); // 描画のデバイス コンテキスト

		SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

		// クライアントの四角形領域内の中央
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;

		// アイコンの描画
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialogEx::OnPaint();
	}
}

// ユーザーが最小化したウィンドウをドラッグしているときに表示するカーソルを取得するために、
//  システムがこの関数を呼び出します。
HCURSOR CTextInputOutputDlg::OnQueryDragIcon()
{
	return static_cast<HCURSOR>(m_hIcon);
}



void CTextInputOutputDlg::OnBnClickedButtonInput()
{
	// ここはテキスト読込処理
	
	CString strTitle = _T("テキスト読込処理タイトル");
	static char BASED_CODE szFilter[] = "テキストドキュメント|*.txt|";
	
	// CFileDialog インスタンスの作成
	CFileDialog* dlgFile = new CFileDialog(TRUE, NULL, NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, szFilter);
	dlgFile->m_ofn.lpstrTitle = strTitle;	// タイトル設定

	// ファイルダイアログの表示
	INT_PTR iRetFileDlg = dlgFile->DoModal();
	if (iRetFileDlg == IDOK)
	{
		// 開くボタンが押下された
		CString strPath = dlgFile->GetPathName();	//ファイルのパス

		CFile file;
		if (file.Open(strPath, CFile::modeRead))
		{
			// ファイルの内容を読み込む
			UINT dwFileLength = (UINT)file.GetLength();
			BYTE* pBuffer = new BYTE[dwFileLength + 1];
			file.Read(pBuffer, dwFileLength);
			pBuffer[dwFileLength] = 0;	// NULL終端
			file.Close();

			// UTF-8からワイド文字列への変換
			int nChars = MultiByteToWideChar(CP_UTF8, 0, (LPCSTR)pBuffer, -1, NULL, 0);
			WCHAR* pszWBuff = new WCHAR[nChars];
			MultiByteToWideChar(CP_UTF8, 0, (LPCSTR)pBuffer, -1, pszWBuff, nChars);

			// ワイド文字列からANSI文字列への変換
			int nAnsiChars = WideCharToMultiByte(CP_ACP, 0, pszWBuff, -1, NULL, 0, NULL, NULL);
			char* pszABuff = new char[nAnsiChars];
			WideCharToMultiByte(CP_ACP, 0, pszWBuff, -1, pszABuff, nAnsiChars, NULL, NULL);

			// エディットボックスに設定
			SetDlgItemText(IDC_EDIT_TEXT, CString(pszABuff));

			delete[] pBuffer;
			delete[] pszWBuff;
			delete[] pszABuff;
		}
	}
	else
	{
		// キャンセルボタンが押下された
	}
}


void CTextInputOutputDlg::OnBnClickedButtonOutput()
{
	// ここはテキスト出力処理

	CString strTitle = _T("テキスト出力処理タイトル");
	static char BASED_CODE szFilter[] = "テキストドキュメント|*.txt|";

	CFileDialog dlgFile(FALSE, "*.txt", NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, szFilter);
	dlgFile.m_ofn.lpstrTitle = strTitle;	// タイトル設定

	// ファイルダイアログの表示
	INT_PTR iRetFileDlg = dlgFile.DoModal();
	if (iRetFileDlg == IDOK)
	{
		// 保存ボタンが押下された
		CString strPath = dlgFile.GetPathName();	//ファイルのパス

		// エディットボックス内のテキスト取得
		CString strText = _T("");
		GetDlgItemText(IDC_EDIT_TEXT, strText);

		CStdioFile* pStdioFile = new CStdioFile(strPath, (CFile::modeWrite | CFile::modeCreate));
		pStdioFile->Seek(0, CFile::end);
		pStdioFile->WriteString(strText);
		delete pStdioFile;
		pStdioFile = NULL;
	}
	else
	{
		// キャンセルボタンが押下された
	}
}

コメント

タイトルとURLをコピーしました