.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;
}
主函数中的代码可以改,直接按照规定格式调用类的成员函数即可。
感谢各位观看。