MFC实现ini配置文件的读取

news2025/1/18 7:33:45

MFC实现 ini 配置文件的读取1

实现的功能:点击导入配置文件按钮可以在旁边编辑框中显示配置文件的路径,以及在下面的编辑框中显示配置文件的内容。

image

1. 显示配置文件内容的编辑框设置

对于显示配置文件内容的 Edit Contorl 编辑框的属性设置如下:

  • ID: IDC_INI_SHOW_EDIT
  • Auto HScroll、Auto VScroll、Horizontal Scroll、Vertical Scroll、Multiline、Read Only、Want Return均设置为True

以下是这些属性的含义:

  1. Auto HScroll(自动水平滚动):当文本内容宽度超出编辑框的可视区域时,是否自动显示水平滚动条。
  2. Auto VScroll(自动垂直滚动):当文本内容高度超出编辑框的可视区域时,是否自动显示垂直滚动条。
  3. Horizontal Scroll(水平滚动):是否允许用户手动水平滚动编辑框中的文本内容。
  4. Vertical Scroll(垂直滚动):是否允许用户手动垂直滚动编辑框中的文本内容。
  5. Multiline(多行):指定编辑框是否允许多行文本输入。如果启用了多行模式,编辑框可以显示多行文本,否则只能显示单行文本。
  6. Read Only(只读):指定编辑框是否为只读模式。如果启用了只读模式,用户无法修改编辑框中的文本内容。
  7. Want Return(想要回车):指定编辑框是否将回车键视为换行字符。如果启用了此选项,并且编辑框是多行的,则按下回车键会在文本中插入换行符。

image

2. 显示配置文件路径的设置

ID: IDC_INI_PATH_EDIT

image

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 导入配置文件自动显示的页面

image

1.2 填写修改信息,以及改变复选框状态

image

image

1.3 点击显示按钮查看配置文件内容

image

1.4 点击刷新按钮清空信息,但不会清楚按钮的选择

image

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 文件内容。以下是实现这个功能的一种方法:

  1. 首先,在资源编辑器中创建一个新的对话框模板,可以命名为 IDD_SHOW_CONTENT_DIALOG,在这个对话框中添加一个多行编辑框控件(ID 设置为 IDC_CONTENT_EDIT)用于显示INI文件内容。

  2. 创建一个新的对话框类,比如 CShowContentDialog,作为刚刚创建的对话框模板的关联类。

  3. CShowContentDialog 类中添加一个成员变量用于存储INI文件的内容,比如 CString m_strIniContent;

    #pragma once
    // CShowContentDialog 对话框
    class CShowContentDialog : public CDialog
    {
    	....
    private:
    	CString m_strIniContent;
    };
    
  4. CShowContentDialog 类中添加一个成员函数,用于设置INI文件的内容,比如:

#pragma once
// 在 ShowContentDialog.h 头文件

// CShowContentDialog 对话框

class CShowContentDialog : public CDialog
{
	....
public:
	void SetIniContent(const CString& content)
	{
		m_strIniContent = content;
	}
	BOOL OnInitDialog();
};

  1. OnInitDialog 函数中将 m_strIniContent 设置到编辑框控件中,以便在对话框初始化时显示INI文件的内容。
// 在 ShowContentDialog.cpp 文件中
BOOL CShowContentDialog::OnInitDialog()
{
	CDialog::OnInitDialog();
	SetDlgItemText(IDC_CONTENT_EDIT, m_strIniContent);
	return TRUE;
}
  1. 在主对话框类(即包含“显示内容”按钮的对话框)中,添加一个成员变量用于存储 CShowContentDialog 的实例,例如:
// READINIDlg.h : 头文件
#pragma once
#include "fstream"
#include "sstream"
#include "ShowContentDialog.h"

// CREADINIDlg 对话框
class CREADINIDlg : public CDialog
{
private:
	CShowContentDialog m_showContentDlg;
};

  1. 在点击“显示内容”按钮的消息处理函数中,读取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;
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1628121.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

自制音频格式二维码的方法,适合多种音频格式使用

现在可以通过二维码的方法来传递音频文件是很常用的一种方式&#xff0c;可以将单个或者多个音频放入一个二维码&#xff0c;通过手机扫码来调取云端储存的音频文件来播放内容&#xff0c;这样可以让多人同时扫码获取内容&#xff0c;提升传播速度。 音频二维码制作的方法也比…

纵览2024年:排名靠前的项目管理软件一览!

时间飞逝&#xff0c;2024年已经过去近半&#xff0c;让我们来盘点2024年排名靠前的项目管理软件&#xff0c;项目管理软件排行榜&#xff0c;本次上榜的项目管理软件有Zoho Projects、Microsoft Project、Nifty、Smartsheet、ClickUp。 一、项目管理软件排行榜 1.Zoho Projec…

航空企业数字化解决方案(207页PPT)

一、资料描述 航空企业数字化解决方案是一项针对航空公司在数字化转型过程中所面临挑战的全面应对策略&#xff0c;旨在通过先进的信息技术提升航空企业的运营效率、客户服务水平以及市场竞争力。这份207页的PPT详细介绍了航空企业数字化的各个方面&#xff0c;包括关键技术的…

解决主机有网络但虚拟机没网络连接问题----记录

问题描述&#xff1a;主机Windows有网络但虚拟机Linux没有网络 1.使用ifconfig 命令查看Linux网络IP 发现只有lo本地回环网卡ip并没有真实网卡IP 2.查看本地所有网卡 终端输入 ip link show 结果&#xff1a;虚拟机上还有一个ens33 真实的网卡驱动&#xff0c; 解决办法&…

Aurora-64B/10B、XDMA与DDR结合设计高速数据流通路设计/Aurora光纤设计/XDMA读取DDR设计/基于FPGA的高速数据传输设计

因最近想通过FPGA把数据从光纤传到PC&#xff0c;借此机会和大家一起学习Aurora、XDMA结合DDR 制作不易&#xff0c;记得三连哦&#xff0c;给我动力&#xff0c;持续更新&#xff01;&#xff01;&#xff01; 完整工程文件下载&#xff1a;XDMA读写DDR工程 提取码&…

数据结构——二叉树练习(深搜广搜)

数据结构——二叉树练习 路径之和深度优先算法和广度优先算法二叉搜索树判断一棵二叉树是否为搜索二叉树和完全二叉树 我们今天来看二叉树的习题&#xff1a; 路径之和 https://leetcode.cn/problems/path-sum-ii/ 这是一个典型的回溯&#xff0c;深度优先算法的题&#xff0c…

Docker镜像和容器操作

目录 一.Docker镜像创建与操作 1. 搜索镜像 2. 获取镜像 3. 镜像加速下载 4. 查看镜像信息 5. 查看下载的镜像文件信息 ​编辑6. 查看下载到本地的所有镜像 7. 根据镜像的唯一标识ID号&#xff0c;获取镜像详细信息 8. 为本地的镜像添加新的标签 9. 删除镜像 10. 存入…

【1731】jsp 房租跟踪监控管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 JSP 房租跟踪监控管理系统是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysq…

【uniapp/ucharts】采用 uniapp 框架的 h5 应用使用 ucharts(没有 uni_modules)

这种情况无法直接从 dcloud 平台上一键下载导入&#xff0c;所以应该在官网推荐的 git 仓库去单独下载&#xff1a; https://gitee.com/uCharts/uCharts/tree/master/uni-app/uCharts-%E7%BB%84%E4%BB%B6/qiun-data-charts(%E9%9D%9Euni_modules) 下载的文件是如图所示的路径&…

AI大模型探索之路-训练篇2:大语言模型预训练基础认知

文章目录 前言一、预训练流程分析二、预训练两大挑战三、预训练网络通信四、预训练数据并行五、预训练模型并行六、预训练3D并行七、预训练代码示例总结 前言 在人工智能的宏伟蓝图中&#xff0c;大语言模型&#xff08;LLM&#xff09;的预训练是构筑智慧之塔的基石。预训练过…

如何将web content项目导入idea并部署到tomcat

将Web Content项目导入IntelliJ IDEA并部署到Tomcat主要涉及以下几个步骤&#xff1a; 1. 导入Web Content项目 打开IntelliJ IDEA。选择“File” -> “New” -> “Project from Existing Sources…”。浏览到你的Web Content项目的文件夹&#xff0c;并选择它。Intell…

数据结构(C):时间复杂度和空间复杂度

目录 &#x1f680; 0.前言 &#x1f680; 1.为何会有时间复杂度和空间复杂度的概念 &#x1f680; 2.时间复杂度 2.1初步时间复杂度 2.2大O表示法 2.2.1.O&#xff08;N*N&#xff09; 2.2.2.O&#xff08;N&#xff09; 2.2.3.O&#xff08;1&#xff09; 2.3最坏情况…

【Qt】error LNK2001: 无法解析的外部符号

参考&#xff1a;Qt/VS LNK2019/LNK2001&#xff1a;无法解析的外部符号_qt lnk2001无法解析的外部符号-CSDN博客 微软官方报错文档-链接器工具错误 LNK2019 __declspec error LNK2001: 无法解析的外部符号 "__declspec(dllimport) 原因 以这种为前缀的基本上跟库相关…

微信小程序:11.本地生活小程序制作

开发工具&#xff1a; 微信开发者工具apifox进行创先Mock 项目初始化 新建小程序项目输入ID选择不使用云开发&#xff0c;js传统模版在project.private.config中setting配置项中配置checkinalidKey&#xff1a;false 梳理项目结构 因为该项目有三个tabbar所以我们要创建三…

点击消除

点击消除 描述&#xff1a; 对一个字符串&#xff0c;每次“点击”&#xff0c;可以把字符串中相邻两个 相同字母消除。 例如&#xff0c;字符串"abbc"点击后可以生成"ac"。 但相同而不相邻、不相同的相邻字母都是不可以被消除的。 如果想把字符串变得…

比亚迪24届春招Offer面经

本文介绍2024届春招中&#xff0c;比亚迪的高级底盘工程师岗位1场面试的基本情况、提问问题等。 2024年04月投递了比亚迪的系统开发类、 技术研发类、 技术研究类岗位&#xff0c;面试结束后分配至高级底盘工程师岗位&#xff1b;面试前未确定部门&#xff0c;面试结束后分配至…

关于OSPF报文学习

目录 一.OSPF学习补充 &#xff08;1&#xff09;OSPF报文头部 &#xff08;2&#xff09;ospf建立邻居关系 1.Hello报文——建立邻居关系 2.hello报文头部 &#xff08;3&#xff09;OSPF建立邻接关系 1.发送DD报文 2.DD报文头部 &#xff08;4&#xff09;关于DR,BD…

Blender点操作

顶点操作即一般的“布线”操作 1.顶点移动 -先切到顶点模式 -移动&#xff0c;G 或 G X/Y/Z -旋转&#xff0c;R 同上 -缩放&#xff0c;S 同上 2.顶点滑移&#xff0c;用于微调顶点的位置 快捷键&#xff1a;Shift V&#xff0c;G G 3.顶点删除 -选中一个顶点 -按…

【算法】人工蜂群算法,解决多目标车间调度问题,柔性车间调度问题

文章目录 复现论文什么是柔性作业车间调度问题&#xff1f;数据处理ABC算法编码解码种群初始化雇佣蜂操作IPOX交叉多点交叉 观察蜂操作侦察蜂操作算法流程 结果程序截图问询、帮助 复现论文 什么是柔性作业车间调度问题&#xff1f; 也叫多目标车间调度问题。 柔性作业车间调…

构建NodeJS库--前端项目的打包发布

1. 前言 学习如何打包发布前端项目&#xff0c;需要学习以下相关知识&#xff1a; package.json 如何初始化配置&#xff0c;以及学习npm配置项&#xff1b; 模块类型type配置&#xff0c; 这是nodejs的package.json的配置main 入口文件的配置 webpack 是一个用于现代 JavaSc…