MFC实现 ini 配置文件的读取1
实现的功能:点击导入配置文件按钮可以在旁边编辑框中显示配置文件的路径,以及在下面的编辑框中显示配置文件的内容。
1. 显示配置文件内容的编辑框设置
对于显示配置文件内容的 Edit Contorl 编辑框的属性设置如下:
- ID: IDC_INI_SHOW_EDIT
- Auto HScroll、Auto VScroll、Horizontal Scroll、Vertical Scroll、Multiline、Read Only、Want Return均设置为True
以下是这些属性的含义:
- Auto HScroll(自动水平滚动):当文本内容宽度超出编辑框的可视区域时,是否自动显示水平滚动条。
- Auto VScroll(自动垂直滚动):当文本内容高度超出编辑框的可视区域时,是否自动显示垂直滚动条。
- Horizontal Scroll(水平滚动):是否允许用户手动水平滚动编辑框中的文本内容。
- Vertical Scroll(垂直滚动):是否允许用户手动垂直滚动编辑框中的文本内容。
- Multiline(多行):指定编辑框是否允许多行文本输入。如果启用了多行模式,编辑框可以显示多行文本,否则只能显示单行文本。
- Read Only(只读):指定编辑框是否为只读模式。如果启用了只读模式,用户无法修改编辑框中的文本内容。
- Want Return(想要回车):指定编辑框是否将回车键视为换行字符。如果启用了此选项,并且编辑框是多行的,则按下回车键会在文本中插入换行符。
2. 显示配置文件路径的设置
ID: IDC_INI_PATH_EDIT
3. 导入配置文件按钮的设置
ID: IDC_SHOW_INI_BUTTON
Caption: 导入配置文件
然后双击这个“导入配置文件”按钮跳转到 void CReadWriteiniDlg::OnBnClickedShowIniButton()
函数实现具体操作
void CReadWriteiniDlg::OnBnClickedShowIniButton()
{
// TODO: 在此添加控件通知处理程序代码
CString iniFilePath; // 保存配置文件路径
CFileDialog dlg(TRUE, NULL, NULL, OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT, _T("All Files(*.ini)|*.ini|所有文件(*.*)|*.*|"), NULL);
if(dlg.DoModal())
{
iniFilePath = dlg.GetPathName(); // 获取配置文件完整路径并存储到 iniFilePath 变量中
}
SetDlgItemText(IDC_INI_PATH_EDIT, iniFilePath); // 将 iniFilePath 保存的路径 显示到编辑框中
// 打开 INI 文件以读取内容
std::ifstream infile(iniFilePath);
// 检查文件是否成功打开
if (infile.is_open()) {
// 创建一个缓冲区,用于存储文件内容
std::ostringstream buffer;
// 逐行读取文件内容
std::string line;
while(std::getline(infile, line)) {
// 将每行内容添加到缓冲区,并在每行末尾添加换行符
buffer << line << "\r\n";
}
// 关闭文件
infile.close();
// 将缓冲区中的内容转换为 CString 类型
CString strIniContent(buffer.str().c_str());
// 显示读取到的内容在编辑框中
SetDlgItemText(IDC_INI_SHOW_EDIT, strIniContent);
}
}
MFC实现 ini 配置文件2
包含导入、查询、修改、显示、单/复选框的选择的功能
1. 页面显示
1.1 导入配置文件自动显示的页面
1.2 填写修改信息,以及改变复选框状态
1.3 点击显示按钮查看配置文件内容
1.4 点击刷新按钮清空信息,但不会清楚按钮的选择
2. 导入配置文件按钮事件处理函数
// 导入配置文件事件处理函数
void CREADINIDlg::OnBnClickedSelectFileButton()
{
// TODO: 在此添加控件通知处理程序代码
CString m_strFilePathName;
CFileDialog dlg(TRUE, NULL, NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, _T("All File(*.ini)|*.ini|所有文件(*.*)|*.*|"), NULL);
if(dlg.DoModal())
{
m_strFilePathName = dlg.GetPathName();
}
SetDlgItemText(IDC_FILE_PATH_EDIT, m_strFilePathName);
CREADINIDlg::OnBnClickedGetButton();
}
3. 查询按钮事件处理函数
// 读取配置文件
void CREADINIDlg::OnBnClickedGetButton()
{
// TODO: 在此添加控件通知处理程序代码
// 读取配置文件方式一:
CFileFind finder;
CString m_IniFile = _T("");
GetDlgItem(IDC_FILE_PATH_EDIT)->GetWindowText(m_IniFile);
BOOL ifFind = finder.FindFile(m_IniFile);
if(!ifFind)
{
AfxMessageBox(_T("没有该文件"));
return;
}
CString str;
GetPrivateProfileString(_T("MYSQL"), _T("HostName"), _T(""), str.GetBuffer(MAX_PATH), MAX_PATH, m_IniFile);
SetDlgItemText(IDC_EDIT2, str);
GetPrivateProfileString(_T("MYSQL"), _T("Port"), _T(""), str.GetBuffer(MAX_PATH), MAX_PATH, m_IniFile);
SetDlgItemText(IDC_EDIT3, str);
GetPrivateProfileString(_T("MYSQL"), _T("UserName"), _T(""), str.GetBuffer(MAX_PATH), MAX_PATH, m_IniFile);
SetDlgItemText(IDC_EDIT4, str);
GetPrivateProfileString(_T("MYSQL"), _T("PassWord"), _T(""), str.GetBuffer(MAX_PATH), MAX_PATH, m_IniFile);
SetDlgItemText(IDC_EDIT5, str);
// 读取配置文件方式二:
GetCurrentDirectory(MAX_PATH, IniFile);
wcscat_s(IniFile, _T("\\Config.ini"));
m_select_1 = GetPrivateProfileInt(_T("Select"),_T("m_select_1"), 0, IniFile);
m_select_2 = GetPrivateProfileInt(_T("Select"),_T("m_select_2"), 0, IniFile);
m_select_3 = GetPrivateProfileInt(_T("Select"),_T("m_select_3"), 0, IniFile);
m_check_1 = GetPrivateProfileInt(_T("Check"),_T("m_check_1"), 0, IniFile);
m_check_2 = GetPrivateProfileInt(_T("Check"),_T("m_check_2"), 0, IniFile);
m_check_3 = GetPrivateProfileInt(_T("Check"),_T("m_check_3"), 0, IniFile);
m_check_4 = GetPrivateProfileInt(_T("Check"),_T("m_check_4"), 0, IniFile);
m_check_5 = GetPrivateProfileInt(_T("Check"),_T("m_check_5"), 0, IniFile);
m_check_6 = GetPrivateProfileInt(_T("Check"),_T("m_check_6"), 0, IniFile);
UpdateData(FALSE);
}
4. 修改按钮事件处理函数
// 修改配置文件
void CREADINIDlg::OnBnClickedWriteButton()
{
UpdateData(TRUE); // 方式二才需要加上这句,方式一不用
// TODO: 在此添加控件通知处理程序代码
// 写入配置文件方式一:
CString m_IniFile = _T("");
GetDlgItem(IDC_FILE_PATH_EDIT)->GetWindowTextW(m_IniFile);
CFile File;
File.Open(m_IniFile, CFile::modeCreate | CFile::modeWrite, NULL);
File.Close();
CFileFind finder;
BOOL ifFind = finder.FindFile(m_IniFile);
if (!ifFind) {
AfxMessageBox(_T("没有该文件"));
return;
}
// 写入基本信息
CString str = _T(""), StrTop = _T("MYSQL"), StrHostName = _T("HostName"), StrPort = _T("Port"),
StrUserName = _T("UserName"), StrPassWord = _T("PassWord");
GetDlgItemText(IDC_EDIT6, str);
WritePrivateProfileStringW(StrTop, StrHostName, str, m_IniFile);
GetDlgItemText(IDC_EDIT7, str);
WritePrivateProfileStringW(StrTop, StrPort, str, m_IniFile);
GetDlgItemText(IDC_EDIT8, str);
WritePrivateProfileStringW(StrTop, StrUserName, str, m_IniFile);
GetDlgItemText(IDC_EDIT9, str);
WritePrivateProfileStringW(StrTop, StrPassWord, str, m_IniFile);
// 写入配置文件方式二:
GetCurrentDirectory(MAX_PATH, IniFile);
wcscat_s(IniFile, _T("\\Config.ini"));
WritePrivateProfileInt_2(_T("Select"), _T("m_select_1"), m_select_1, IniFile);
WritePrivateProfileInt_2(_T("Select"), _T("m_select_2"), m_select_2, IniFile);
WritePrivateProfileInt_2(_T("Select"), _T("m_select_3"), m_select_3, IniFile);
WritePrivateProfileInt_2(_T("Check"), _T("m_check_1"), m_check_1, IniFile);
WritePrivateProfileInt_2(_T("Check"), _T("m_check_2"), m_check_2, IniFile);
WritePrivateProfileInt_2(_T("Check"), _T("m_check_3"), m_check_3, IniFile);
WritePrivateProfileInt_2(_T("Check"), _T("m_check_4"), m_check_4, IniFile);
WritePrivateProfileInt_2(_T("Check"), _T("m_check_5"), m_check_5, IniFile);
WritePrivateProfileInt_2(_T("Check"), _T("m_check_6"), m_check_6, IniFile);
// 弹出消息框提示修改完成
AfxMessageBox(_T("配置文件修改完成!"));
}
5. 刷新按钮事件处理函数
void CREADINIDlg::OnBnClickedFlushButton()
{
// TODO: 在此添加控件通知处理程序代码
SetDlgItemText(IDC_EDIT2, _T(""));
SetDlgItemText(IDC_EDIT3, _T(""));
SetDlgItemText(IDC_EDIT4, _T(""));
SetDlgItemText(IDC_EDIT5, _T(""));
SetDlgItemText(IDC_EDIT6, _T(""));
SetDlgItemText(IDC_EDIT7, _T(""));
SetDlgItemText(IDC_EDIT8, _T(""));
SetDlgItemText(IDC_EDIT9, _T(""));
}
6. 显示按钮事件处理函数
void CREADINIDlg::OnBnClickedShowIniButton()
{
CString IniFile = _T("");
GetDlgItem(IDC_FILE_PATH_EDIT)->GetWindowTextW(IniFile);
// 打开 INI 文件以读取内容
std::ifstream infile(IniFile);
if (infile.is_open())
{
std::ostringstream buffer;
// 逐行读取文件内容
std::string line;
while(std::getline(infile, line)) {
buffer << line << "\r\n";
}
infile.close();
// 将缓冲区中的内容转换为 CString 类型
CString strIniContent(buffer.str().c_str());
// 显示读取到的内容在编辑框中
//SetDlgItemText(IDC_CONTENT_EDIT, strIniContent);
m_showContentDlg.SetIniContent(strIniContent);
m_showContentDlg.DoModal();
}
}
6.1 实现步骤
创建一个新的对话框类用于显示完整的 INI 文件内容。以下是实现这个功能的一种方法:
-
首先,在资源编辑器中创建一个新的对话框模板,可以命名为
IDD_SHOW_CONTENT_DIALOG
,在这个对话框中添加一个多行编辑框控件(ID 设置为IDC_CONTENT_EDIT
)用于显示INI文件内容。 -
创建一个新的对话框类,比如
CShowContentDialog
,作为刚刚创建的对话框模板的关联类。 -
在
CShowContentDialog
类中添加一个成员变量用于存储INI文件的内容,比如CString m_strIniContent;
。#pragma once // CShowContentDialog 对话框 class CShowContentDialog : public CDialog { .... private: CString m_strIniContent; };
-
在
CShowContentDialog
类中添加一个成员函数,用于设置INI文件的内容,比如:
#pragma once
// 在 ShowContentDialog.h 头文件
// CShowContentDialog 对话框
class CShowContentDialog : public CDialog
{
....
public:
void SetIniContent(const CString& content)
{
m_strIniContent = content;
}
BOOL OnInitDialog();
};
- 在
OnInitDialog
函数中将m_strIniContent
设置到编辑框控件中,以便在对话框初始化时显示INI文件的内容。
// 在 ShowContentDialog.cpp 文件中
BOOL CShowContentDialog::OnInitDialog()
{
CDialog::OnInitDialog();
SetDlgItemText(IDC_CONTENT_EDIT, m_strIniContent);
return TRUE;
}
- 在主对话框类(即包含“显示内容”按钮的对话框)中,添加一个成员变量用于存储
CShowContentDialog
的实例,例如:
// READINIDlg.h : 头文件
#pragma once
#include "fstream"
#include "sstream"
#include "ShowContentDialog.h"
// CREADINIDlg 对话框
class CREADINIDlg : public CDialog
{
private:
CShowContentDialog m_showContentDlg;
};
- 在点击“显示内容”按钮的消息处理函数中,读取INI文件的内容,并将内容设置到
CShowContentDialog
实例中,然后显示该对话框,例如:
void CREADINIDlg::OnBnClickedShowIniButton()
{
CString IniFile = _T("");
GetDlgItem(IDC_FILE_PATH_EDIT)->GetWindowTextW(IniFile);
// 打开 INI 文件以读取内容
std::ifstream infile(IniFile);
if (infile.is_open())
{
std::ostringstream buffer;
// 逐行读取文件内容
std::string line;
while(std::getline(infile, line)) {
buffer << line << "\r\n";
}
infile.close();
// 将缓冲区中的内容转换为 CString 类型
CString strIniContent(buffer.str().c_str());
// 显示读取到的内容在编辑框中
//SetDlgItemText(IDC_CONTENT_EDIT, strIniContent);
m_showContentDlg.SetIniContent(strIniContent);
m_showContentDlg.DoModal();
}
}
这样,点击“显示内容”按钮时,就会弹出一个对话框,其中包含一个编辑框,显示 INI 文件的完整内容。
6.2 成员变量及函数
// READINIDlg.h : 头文件
//
#pragma once
#include "fstream"
#include "sstream"
#include "ShowContentDialog.h"
// CREADINIDlg 对话框
class CREADINIDlg : public CDialog
{
。。。省略
public:
。。。省略
// 下面这两个才是自己写的
afx_msg void ReadRadioCheckStatus(const CString& IniFile, const CString& sectionName, const CString& prefix, int count, UINT baseID);
afx_msg BOOL WritePrivateProfileInt_2(TCHAR* AppName, TCHAR*keyName, UINT value, TCHAR* lpFileName);
private:
TCHAR IniFile[MAX_PATH]; // 方式二存储配置文件的路径
int m_select_1;
int m_select_2;
int m_select_3;
int m_check_1;
int m_check_2;
int m_check_3;
int m_check_4;
int m_check_5;
int m_check_6;
};