MFC实现ini配置文件的读取

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;
};

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

vue3中所有页面需要手动刷新一下才能显示,控制台没有报错

1.问题 登录进来是进入首页&#xff0c;然后切换任何页面都是空白&#xff0c;但是控制台没有报错。在其他页面刷新后却能显示&#xff0c;然而切换到首页刷新后再切换到其他页面又是空白。 2.解决问题 原因&#xff1a;在于首页给了两个根标签&#xff0c;我把其中一个根标签…

视频输入c++ 调用 libtorch推理

1、支持GPU情况 libtorch 支持GPU情况比较奇怪&#xff0c;目前2.3 版本需要在链接器里面加上以下命令&#xff0c;否则不会支持gpu -INCLUDE:?ignore_this_library_placeholderYAHXZ 2 探测是否支持 加一个函数看你是否支持torch&#xff0c;不然不清楚&#xff0c;看到…

axios——503响应超时重复多次请求——技能提升

今天在写后台管理系统时&#xff0c;遇到一个问题&#xff0c;就是每天早上一启动项目&#xff0c;接口会提示503超时&#xff0c;因此项目运行必须重新刷新请求成功后才可以正常使用。 后端同事说请求超时了&#xff0c;需要前端处理一下&#xff0c;如果是503的状态码&#…

封装 H.264 视频为 FLV 格式然后推流

封装 H.264 视频为 FLV 格式并通过 RTMP 推流 flyfish 协议 RTMP (Real-Time Messaging Protocol) RTSP (Real Time Streaming Protocol) SRT (Secure Reliable Transport) WebRTC RTMP&#xff08;Real Time Messaging Protocol&#xff09;是一种用于实时音视频流传输的协…

西安交通大学 915 备考常见误区

看到助教在 915 全程班群里给同学们解答问题&#xff0c;我也是感触颇深&#xff0c;想起来我当年自身的一个备考情况。接下来结合我自身情况给同学们分析一下&#xff0c;为什么有的同学基础一般&#xff0c;最后分数却很高&#xff0c;有的同学基础很好&#xff0c;分数却一般…

Linux网络编程---多进/线程并发服务器

一、多进程并发服务器 实现一个服务器可以连接多个客户端&#xff0c;每当accept函数等待到客户端进行连接时 就创建一个子进程 思路分析&#xff1a; 核心思路&#xff1a;让accept循环阻塞等待客户端&#xff0c;每当有客户端连接时就fork子进程&#xff0c;让子进程去和客户…

html+css+js+jquery实现在网页端将手动输入用户的信息转化成表格

1.实现的效果图 2.css代码 ​<style>*{background-color: antiquewhite;}#ss{font-size:20px;text-align: center;}#inputForm { margin-bottom: 20px; } #userTable { width: 100%; border-collapse: collapse; } #userTable th, #userTable td { border: 1px …

Xcode for Mac:强大易用的集成开发环境

Xcode for Mac是一款专为苹果开发者打造的集成开发环境&#xff08;IDE&#xff09;&#xff0c;它集成了代码编辑器、编译器、调试器等一系列开发工具&#xff0c;让开发者能够在同一界面内完成应用的开发、测试和调试工作。 Xcode for Mac v15.2正式版下载 Xcode支持多种编程…

Linux进阶篇:CentOS7搭建NFS文件共享服务

CentOS7搭建NFS文件共享服务 一、NFS介绍 NFS(Network File System)意为网络文件系统&#xff0c;它最大的功能就是可以通过网络&#xff0c;让不同的机器不同的操作系统可以共享彼此的文件。简单的讲就是可以挂载远程主机的共享目录到本地&#xff0c;就像操作本地磁盘一样&…

Ubentu18.0+ORBSLAM2

Ubentu18.0ORB-SLAM2摄像头 引言&#xff1a; ​ 在视觉同步定位与地图构建&#xff08;Simultaneous Localization and Mapping, SLAM&#xff09;领域&#xff0c;ORB-SLAM2系统的出现标志着重要的技术进步。这个著名的SLAM系统由Juan D. Tards、Ral Mur-Artal等人开发&#…

RabbitMQ发布确认和消息回退(6)

概念 发布确认原理 生产者将信道设置成 confirm 模式&#xff0c;一旦信道进入 confirm 模式&#xff0c;所有在该信道上面发布的消息都将会被指派一个唯一的 ID(从 1 开始)&#xff0c;一旦消息被投递到所有匹配的队列之后&#xff0c;broker就会发送一个确认给生产者(包含消…

git 基础知识(全能版)

文章目录 一 、git 有三个分区二、git 基本操作1、克隆—git clone2、拉取—git fetch / git pull3、查看—git status / git diff3.1 多人开发代码暂存技巧 本地代码4、提交—git add / git commit / git push5、日志—git log / git reflog6、删除—git rm ‘name’7、撤销恢…

OceanBase开发者大会实录 - 阳振坤:云时代的数据库

本文来自2024 OceanBase开发者大会&#xff0c;OceanBase 首席科学家阳振坤的演讲实录——《云时代的数据库》。完整视频回看&#xff0c;请点击这里 >> 在去年的开发者大会中&#xff0c;我跟大家分享了我对数据库产品和技术一些看法&#xff0c;包括单机分布式一体化&…

字符函数·字符串函数·C语言内存函数—使用和模拟实现

字符函数字符串函数C语言内存函数 1.字符分类函数2. 字符转换函数3. strlen的使用和模拟实现4.strcpy的使用和模拟实现5.strcat的使用和模拟实现6.strcmp的使用和模拟实现7.strncpy的模拟和实现8.strncat的实现和模拟实现9.strncmp函数使用10.strstr的使用和模拟实现11.strtok函…

备考数通HCIE证书4点经验分享!

大家好&#xff0c;我是来自安阳工学院20级网络工程的刁同学&#xff0c;在2023年12月20日成功通过了华为Datacom HCIE认证&#xff0c;并且取得了笔试900多分&#xff0c;实验B的成绩。在此&#xff0c;我想把我的一些考证心得分享给正在备考的小伙伴们。 关于为什么考证 我…

Vue3+ts(day03:ref和reactive)

学习源码可以看我的个人前端学习笔记 (github.com):qdxzw/frontlearningNotes 觉得有帮助的同学&#xff0c;可以点心心支持一下哈&#xff08;笔记是根据b站上学习的尚硅谷的前端视频【张天禹老师】&#xff0c;记录一下学习笔记&#xff0c;用于自己复盘&#xff0c;有需要学…

tcp inflight 守恒算法的自动收敛

inflight 守恒算法看起来只描述理想情况&#xff0c;现实很难满足&#xff0c;是这样吗&#xff1f; 从 reno 到 bbr&#xff0c;无论哪个算法都在描述理想情况&#xff0c;以 reno 和 bbr 两个极端为例&#xff0c;它们分别描述两种理想管道&#xff0c;reno 将 buffer 从恰好…

Apollo 7周年大会:百度智能驾驶的展望与未来

本心、输入输出、结果 文章目录 Apollo 7周年大会&#xff1a;百度智能驾驶的展望与未来前言百度集团副总裁、智能驾驶事业群组总裁王云鹏发言 直播回放大会相关内容先了解 Apollo&#xfeff;开放平台 9.0架构图 发布产品Apollo 定义自己对于智能化的认知百度集团副总裁 王云鹏…

Grafana系列 | Grafana监控TDengine库数据 |Grafana自定义Dashboard

开始前可以去grafana官网看看dashboard文档 https://grafana.com/docs/grafana/latest/dashboards 本文主要是监控TDengine库数据 目录 一、TDengine介绍二、Grafana监控TDengine数据三、Grafana自定义Dashboard 监控TDengine库数据1、grafana 变量2、添加变量3、配置panel 一…

Docker——数据管理和网络通信

目录 一、Docker的数据管理 1.数据卷 2.数据卷容器 3.容器互联 二、Docker镜像的创建 1.基于现有镜像创建 2.基于本地模板创建 3.基于Dockerfile 创建 3.1联合文件系统&#xff08;UnionFS&#xff09; 3.2镜像加载原理 3.3为什么Docker里的Centos大小才200M 4.Dcok…