通过C++操作ini文件

.ini文件是Initialization File的缩写,即初始化文件,是windows的系统配置文件所采用的文件类型。它可以存储程序的配置信息,有的时候我们也需要通过ini文件来存储一些程序配置信息或者数据信息,那么我们如何操作ini文件呢?

这里采用C++来演示操作ini文件,我们需要通过API来操作ini文件。

首先我们用到的头文件有

Windows.h *注意:更改ini文件必须包含此文件,不然无法使用API
iostream
conio.h
string.h

需要用到的API函数有

WritePrivateProfileString()  //写入数据

GetPrivateProfileInt() //读取数值数据

GetPrivateProfileString() //读取字符(串)数据

具体代码如下

我们这里封装了一个操作ini文件的类(包括自己封装的成员函数),我们可以通过调用类的成员函数来进行操作ini文件。类如下:

class INIOperation //INI文件操作 
{
	public:
		char dfiniPath[50]=".//config.ini";
		char iniPath[50]="";
		void Writeini(string appname,string keyname,string value) //向ini文件写入数据(ini路径为[\config.ini])
		{
			string temp[3];
			LPTSTR lpPath,va,an,kn;
			lpPath=new char[MAX_PATH];
			va=new char[MAX_PATH];
			kn=new char[MAX_PATH];
			an=new char[MAX_PATH];
			temp[0]=value;
			temp[1]=keyname;
			temp[2]=appname;
			const char* p = temp[0].data();
			const char* p_1 = temp[1].data();
			const char* p_2 = temp[2].data();
			strcpy(lpPath,iniPath);
			strcpy(va,p);
			strcpy(kn,p_1);
			strcpy(an,p_2);
			WritePrivateProfileString(an,kn,va,lpPath);
		}
		
		int Getinival(string appname,string keyname) //读取ini文件数值类型的数据(ini路径同上)
		{
			int temp;
			string tmp[2];
			LPTSTR lpPath,an,kn;
			lpPath = new char[MAX_PATH];
			an = new char[MAX_PATH];
			kn = new char[MAX_PATH];
			tmp[0]=appname;
			tmp[1]=keyname;
			const char* p=tmp[0].data();
			const char* p_1=tmp[1].data();
			strcpy(lpPath,iniPath);
			strcpy(an,p);
			strcpy(kn,p_1);
			temp=GetPrivateProfileInt(an,kn, 0, lpPath);
			return temp;
		}
		
		string Getinistr(string appname,string keyname,DWORD ReturnedValue) //读取ini文件字符串类型的数据(ini路径同上)
		{
			string temps,tmp[3];
			LPTSTR temp,lpPath,an,kn; 
			lpPath = new char[MAX_PATH];
			an = new char[MAX_PATH];
			kn = new char[MAX_PATH];
			temp = new char[MAX_PATH];
			tmp[0]=appname;
			tmp[1]=keyname;
			const char* p=tmp[0].data();
			const char* p_1=tmp[1].data();
			strcpy(lpPath,iniPath);
			strcpy(an,p);
			strcpy(kn,p_1);
			GetPrivateProfileString(an,kn,"",temp, ReturnedValue, lpPath);	
			char* tempz=temp; 
			temps=tempz; 
			return temps;
		}
		
		void Deliniappname(string appname) //删除一个ini文件的项(ini路径同上)
		{
			string temp[1];
			LPTSTR lpPath,an;
			lpPath=new char[MAX_PATH];
			an=new char[MAX_PATH];
			temp[0]=appname;
			const char* p_1 = temp[0].data();
			strcpy(lpPath,iniPath);
			strcpy(an,p_1);
			WritePrivateProfileString(an,NULL,NULL,lpPath);
		}
		
		void Delinikey(string appname,string keyname) //删除一个ini文件的键(ini路径同上)
		{
			string temp[2];
			LPTSTR lpPath,an,kn;
			lpPath=new char[MAX_PATH];
			kn=new char[MAX_PATH];
			an=new char[MAX_PATH];
			temp[0]=keyname;
			temp[1]=appname;
			const char* p_1 = temp[0].data();
			const char* p_2 = temp[1].data();
			strcpy(lpPath,iniPath);
			strcpy(kn,p_1);
			strcpy(an,p_2);
			WritePrivateProfileString(an,kn,NULL,lpPath);
		} 
};
INIOperation iniop; 

全部代码如下

#include<Windows.h> 
#include<iostream>
#include<conio.h>
#include<string.h>
using namespace std;
class INIOperation //INI文件操作 
{
	public:
		char dfiniPath[50]=".//config.ini";
		char iniPath[50]="";
		void Writeini(string appname,string keyname,string value)
		{
			string temp[3];
			LPTSTR lpPath,va,an,kn;
			lpPath=new char[MAX_PATH];
			va=new char[MAX_PATH];
			kn=new char[MAX_PATH];
			an=new char[MAX_PATH];
			temp[0]=value;
			temp[1]=keyname;
			temp[2]=appname;
			const char* p = temp[0].data();
			const char* p_1 = temp[1].data();
			const char* p_2 = temp[2].data();
			strcpy(lpPath,iniPath);
			strcpy(va,p);
			strcpy(kn,p_1);
			strcpy(an,p_2);
			WritePrivateProfileString(an,kn,va,lpPath);
		}
		
		int Getinival(string appname,string keyname)
		{
			int temp;
			string tmp[2];
			LPTSTR lpPath,an,kn;
			lpPath = new char[MAX_PATH];
			an = new char[MAX_PATH];
			kn = new char[MAX_PATH];
			tmp[0]=appname;
			tmp[1]=keyname;
			const char* p=tmp[0].data();
			const char* p_1=tmp[1].data();
			strcpy(lpPath,iniPath);
			strcpy(an,p);
			strcpy(kn,p_1);
			temp=GetPrivateProfileInt(an,kn, 0, lpPath);
			return temp;
		}
		
		string Getinistr(string appname,string keyname,DWORD ReturnedValue)
		{
			string temps,tmp[3];
			LPTSTR temp,lpPath,an,kn; 
			lpPath = new char[MAX_PATH];
			an = new char[MAX_PATH];
			kn = new char[MAX_PATH];
			temp = new char[MAX_PATH];
			tmp[0]=appname;
			tmp[1]=keyname;
			const char* p=tmp[0].data();
			const char* p_1=tmp[1].data();
			strcpy(lpPath,iniPath);
			strcpy(an,p);
			strcpy(kn,p_1);
			GetPrivateProfileString(an,kn,"",temp, ReturnedValue, lpPath);	
			char* tempz=temp; 
			temps=tempz; 
			return temps;
		}
		
		void Deliniappname(string appname)
		{
			string temp[1];
			LPTSTR lpPath,an;
			lpPath=new char[MAX_PATH];
			an=new char[MAX_PATH];
			temp[0]=appname;
			const char* p_1 = temp[0].data();
			strcpy(lpPath,iniPath);
			strcpy(an,p_1);
			WritePrivateProfileString(an,NULL,NULL,lpPath);
		}
		
		void Delinikey(string appname,string keyname)
		{
			string temp[2];
			LPTSTR lpPath,an,kn;
			lpPath=new char[MAX_PATH];
			kn=new char[MAX_PATH];
			an=new char[MAX_PATH];
			temp[0]=keyname;
			temp[1]=appname;
			const char* p_1 = temp[0].data();
			const char* p_2 = temp[1].data();
			strcpy(lpPath,iniPath);
			strcpy(kn,p_1);
			strcpy(an,p_2);
			WritePrivateProfileString(an,kn,NULL,lpPath);
		} 
};
INIOperation iniop; 

char ininame[50]="\\config.ini";
char tempname[50]=".\\";
string tempininame="";
char a;
int main()
{
	string::size_type idx_2;
	tempininame=ininame;
	idx_2=tempininame.find("\\");
	if(tempininame=="\\config.ini")
	{
		strcpy(iniop.iniPath,iniop.dfiniPath);
	}
	system("title ini文件操作");
	system("cls");
	cout<<"1.写入ini文件数据\n2.读取ini文件数值数据\n3.读取ini文件字符(串)数据\n4.删除ini文件指定项\n5.删除ini文件指定键\n6.更换要操作的ini文件"<<endl;
	a=getch();
	switch(a)
	{
		case '1':
			{
				system("cls");
				string writeappname;
				string writexia; 
				string writedate; 
				if(idx_2==string::npos)
			    {
			    	cout<<"向写入["<<"\\"<<ininame<<"]写入数据"<<endl;
				}
				else
				{
					cout<<"向写入["<<ininame<<"]写入数据"<<endl;
				}
				cout<<"请输入要写入数据的项的名称:";
				cin>>writeappname;
				cout<<"请输入要写入数据的键的名称:";
				cin>>writexia;
				cout<<"请输入要写入的数据:";
				cin>>writedate;
				iniop.Writeini(writeappname,writexia,writedate);
				cout<<"\n写入完成,按任意键返回主界面......"<<endl;
				getch();
			}
		break;
		case '2':
			{
				system("cls");
				string readappname;
				string readxia;
				double readdata;
				if(idx_2==string::npos)
			    {
			    	cout<<"读取["<<"\\"<<ininame<<"]中的数值(double)数据"<<endl;
				}
				else
				{
					cout<<"读取["<<ininame<<"]中的数值(double)数据"<<endl;
				} 
				cout<<"请输入要读取的项的名称:";
				cin>>readappname;
				cout<<"请输入要读取的键的名称:"; 
				cin>>readxia;
				readdata=iniop.Getinival(readappname,readxia);
				cout<<"读取的数值(double类型)为:"<<readdata<<endl; 
				cout<<"\n读取完成,按任意键返回主界面......"<<endl; 
				getch();
			}
		break;
		case '3':
			{
				system("cls");
				string readappname;
				string readxia;
				string readdata;
				if(idx_2==string::npos)
			    {
			    	cout<<"读取["<<"\\"<<ininame<<"]中的字符(串)数据"<<endl;
				}
				else
				{
					cout<<"读取["<<ininame<<"]中的字符(串)数据"<<endl;
				}
				cout<<"请输入要读取的项的名称:";
				cin>>readappname;
				cout<<"请输入要读取的键的名称:"; 
				cin>>readxia;
				readdata=iniop.Getinistr(readappname,readxia,500);
				cout<<"读取的字符(串)为:"<<readdata<<endl; 
				cout<<"\n读取完成,按任意键返回主界面......"<<endl; 
				getch();
			}
		break;
		case '4':
			{
				system("cls");
				string delappname;
				if(idx_2==string::npos)
			    {
			    	cout<<"删除["<<"\\"<<ininame<<"]中的项"<<endl;
				}
				else
				{
					cout<<"删除["<<ininame<<"]中的项"<<endl;
				}
				cout<<"请输入删除的项的名称:";
				cin>>delappname;
				iniop.Deliniappname(delappname); 
				cout<<"该项删除完成"<<endl; 
				cout<<"\n按任意键返回主界面......"<<endl; 
				getch();
			}
		break;
		case '5':
			{
				system("cls");
				string delappname;
				string delxia;
				if(idx_2==string::npos)
			    {
			    	cout<<"删除["<<"\\"<<ininame<<"]中的键"<<endl;
				}
				else
				{
					cout<<"删除["<<ininame<<"]中的键"<<endl;
				}
				cout<<"请输入删除的项的名称:";
				cin>>delappname;
				cout<<"请输入要删除的键的名称:"; 
				cin>>delxia;
				iniop.Delinikey(delappname,delxia);
				cout<<"该键删除完成"<<endl; 
				cout<<"\n按任意键返回主界面......"<<endl; 
				getch();
			}
		break;
		case '6':
			{
				string temppath;
				string::size_type idx;
				system("cls");
				cout<<"当前操作的ini文件为["<<ininame<<"],请输入你要更换为的ini文件的文件名"<<endl;
				cin>>ininame;
				temppath=ininame;
				idx=temppath.find(".ini");
			    if(idx==string::npos)
			    {
			    	strcat(ininame,".ini");
			    	strcpy(iniop.iniPath,tempname);
			    	strcat(iniop.iniPath,ininame);
			        cout<<"操作文件已更改为["<<ininame<<"]"<<endl;
				}
			    else
			    {
			    	strcpy(iniop.iniPath,tempname);
			    	strcat(iniop.iniPath,ininame);
			    	cout<<"操作文件已更改为["<<ininame<<"]"<<endl;
				}
				cout<<"\n按任意键返回主界面......"<<endl; 
				getch(); 
			}
		break;
		default:
			{
				system("cls");
				cout<<"没有这个选项,按任意键返回主界面......"<<endl;	
				getch();
			}
		break;
	} 
	main();
	return 0;
}

主函数中的代码可以改,直接按照规定格式调用类的成员函数即可。

感谢各位观看。

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值