C++如何从文本内读取格式为"string=int"的数据,保存在类里,可直接以string来调用string和关联int的值
例如:txt文本里的数据为:string1=10string2=20string3=10string4=20……在C++新建个类,枚举了string1、string2、s...
例如:
txt文本里的数据为:
string1=10
string2=20
string3=10
string4=20
……
在C++新建个类,枚举了string1、string2、string3、string4
public enum MyClass {
string1,
string2,
string3,
string4
};
然后在类里调用 MyClass::string1.getName() 可以得到txt文本里对应的那个string类型的“string1”。
MyClass::string4.getName() 可以得到txt文本里string4等号右边的int值(20)。
或者有别的好的方案可以实现的,总结一下就是txt文本里等号左值是英文字母,等号右值是整数,写好后可以在程序里以英文字母直接可以分别调用到英文名和整数。
本人初学者,希望大家不吝赐教~! 展开
txt文本里的数据为:
string1=10
string2=20
string3=10
string4=20
……
在C++新建个类,枚举了string1、string2、string3、string4
public enum MyClass {
string1,
string2,
string3,
string4
};
然后在类里调用 MyClass::string1.getName() 可以得到txt文本里对应的那个string类型的“string1”。
MyClass::string4.getName() 可以得到txt文本里string4等号右边的int值(20)。
或者有别的好的方案可以实现的,总结一下就是txt文本里等号左值是英文字母,等号右值是整数,写好后可以在程序里以英文字母直接可以分别调用到英文名和整数。
本人初学者,希望大家不吝赐教~! 展开
6个回答
展开全部
在VC中读写ini配置文件的函数
配置文件中经常用到ini文件,在VC中其函数分别为:
写入.ini文件:bool WritePrivateProfileString(LPCTSTR lpAppName,LPCTSTR lpKeyName,LPCTSTRlpString,LPCTSTR lpFileName);
读取.ini文件:DWORD GetPrivateProfileString(LPCTSTR lpAppName,LPCTSTR lpKeyName,LPCTSTRlpDefaut,LPSTR lpReturnedString,DWORD nSize,LPCTSTR lpFileName);
读取整形值:UINT GetPrivateProfileInt(LPCTSTR lpAppName,LPCTSTR lpKeyName,INTnDefault,LPCTSTR lpFileName);
其中个参数的意思:
LPCTSTR lpAppName ------- INI文件中的一个字段名
LPCTSTR lpKeyName -------- lpAppName 下的一个键名,也就是里面具体的变量名
LPCTSTR lpString ---------是键值,也就是变量的值, 必须为LPCTSTR或CString类型
LPCTSTR lpFileName --------完整的INI文件路径名
LPCTSTR lpDefaut ----------如果没有其前两个参数值,则将此值赋给变量
LPSTR lpReturnedString --------接收INI文件中的值的CString对象,即接收缓冲区
DWORD nSize ------接收缓冲区的大小
例子:
CString StrName,Strtemp;
int nAge;
StrName = "jacky";
nAge = 13;
WritePrivateProfileString("Student","Name",StrName,"c:\\setting.ini");
结果:(INI文件中显示如下:)
[Student]
Name=jacky
读取:
CString SName;
GetPrivateProfileString("Student","Name","DefaultName",SName.GetBuffer(MAX_LENGTH),MAX_LENGTH,"c:\\setting.ini");
结果:SName = "jacky";这里需要注意点就是用完GetBuffer函数后一定要释放(用SName.ReleaseBuffer()函数),不然后面再用到SName的其他子函数就会失灵。
读整数比较简单,如下
int Result = GetPrivateProfileInt("Student","nAge",0,"c:\\setting.ini")返回值即为所读取的结果!
在GetPrivateProfileString最后一个参数是配置文件路径的参数,此路径只能是绝对路径,不能是相对路径,但现在我需要是我的exe文件能和我的配置文件在一起。因此我使用了GetCurrentDirectory函数。
原代码如下:
CString server_ip;
CString des="";
::GetCurrentDirectory(MAX_PATHLENGTH,des.GetBuffer(MAX_PATHLENGTH));
des.ReleaseBuffer();
des+="\\config.ini";
GetPrivateProfileString("PhoneDemo","Server_IP","",server_ip.GetBufferSetLength(15),15,des);
server_ip.ReleaseBuffer();
注意:在这里使用CString变量时,在使用完GetBuffer后,紧接着一定要使用ReleaseBuffer()函数,才可以进行其他的诸如字符串+操作
--------------------转自CSDN-cherryt-----------------------------------------------------
VC读取配置文件(.ini):
CString strIP = _T("");
CString strPort = _T("");
::GetPrivateProfileString("TCP/IP","IP","",
strIP.GetBuffer(MAX_PATH), MAX_PATH,".\\Config.ini");
strIP.ReleaseBuffer();
m_strIP = strIP; //IP地址
::GetPrivateProfileString("TCP/IP","Port","",
strPort.GetBuffer(MAX_PATH), MAX_PATH,".\\Config.ini");
strPort.ReleaseBuffer();
m_iPort = atoi(strPort); //端口号配置文件名为:Config.ini
文件结构:
[TCP/IP]
IP=127.0.0.1
Port=8848
另外:
DWORD GetPrivateProfileString(
LPCTSTR lpAppName, // 你定义的段
LPCTSTR lpKeyName, // 你的键名
LPCTSTR lpDefault, // 没有键值时的默认值
LPTSTR lpReturnedString, // char buff[xx]
DWORD nSize, // xxx
LPCTSTR lpFileName // 配置文件路径(完整路径)
);
WritePrivateProfileString:和上面的差不多,如果将 Private 去掉,可以不加路径(只写文件名),
函数自动到windows的默认路径搜索文件名
配置文件中经常用到ini文件,在VC中其函数分别为:
写入.ini文件:bool WritePrivateProfileString(LPCTSTR lpAppName,LPCTSTR lpKeyName,LPCTSTRlpString,LPCTSTR lpFileName);
读取.ini文件:DWORD GetPrivateProfileString(LPCTSTR lpAppName,LPCTSTR lpKeyName,LPCTSTRlpDefaut,LPSTR lpReturnedString,DWORD nSize,LPCTSTR lpFileName);
读取整形值:UINT GetPrivateProfileInt(LPCTSTR lpAppName,LPCTSTR lpKeyName,INTnDefault,LPCTSTR lpFileName);
其中个参数的意思:
LPCTSTR lpAppName ------- INI文件中的一个字段名
LPCTSTR lpKeyName -------- lpAppName 下的一个键名,也就是里面具体的变量名
LPCTSTR lpString ---------是键值,也就是变量的值, 必须为LPCTSTR或CString类型
LPCTSTR lpFileName --------完整的INI文件路径名
LPCTSTR lpDefaut ----------如果没有其前两个参数值,则将此值赋给变量
LPSTR lpReturnedString --------接收INI文件中的值的CString对象,即接收缓冲区
DWORD nSize ------接收缓冲区的大小
例子:
CString StrName,Strtemp;
int nAge;
StrName = "jacky";
nAge = 13;
WritePrivateProfileString("Student","Name",StrName,"c:\\setting.ini");
结果:(INI文件中显示如下:)
[Student]
Name=jacky
读取:
CString SName;
GetPrivateProfileString("Student","Name","DefaultName",SName.GetBuffer(MAX_LENGTH),MAX_LENGTH,"c:\\setting.ini");
结果:SName = "jacky";这里需要注意点就是用完GetBuffer函数后一定要释放(用SName.ReleaseBuffer()函数),不然后面再用到SName的其他子函数就会失灵。
读整数比较简单,如下
int Result = GetPrivateProfileInt("Student","nAge",0,"c:\\setting.ini")返回值即为所读取的结果!
在GetPrivateProfileString最后一个参数是配置文件路径的参数,此路径只能是绝对路径,不能是相对路径,但现在我需要是我的exe文件能和我的配置文件在一起。因此我使用了GetCurrentDirectory函数。
原代码如下:
CString server_ip;
CString des="";
::GetCurrentDirectory(MAX_PATHLENGTH,des.GetBuffer(MAX_PATHLENGTH));
des.ReleaseBuffer();
des+="\\config.ini";
GetPrivateProfileString("PhoneDemo","Server_IP","",server_ip.GetBufferSetLength(15),15,des);
server_ip.ReleaseBuffer();
注意:在这里使用CString变量时,在使用完GetBuffer后,紧接着一定要使用ReleaseBuffer()函数,才可以进行其他的诸如字符串+操作
--------------------转自CSDN-cherryt-----------------------------------------------------
VC读取配置文件(.ini):
CString strIP = _T("");
CString strPort = _T("");
::GetPrivateProfileString("TCP/IP","IP","",
strIP.GetBuffer(MAX_PATH), MAX_PATH,".\\Config.ini");
strIP.ReleaseBuffer();
m_strIP = strIP; //IP地址
::GetPrivateProfileString("TCP/IP","Port","",
strPort.GetBuffer(MAX_PATH), MAX_PATH,".\\Config.ini");
strPort.ReleaseBuffer();
m_iPort = atoi(strPort); //端口号配置文件名为:Config.ini
文件结构:
[TCP/IP]
IP=127.0.0.1
Port=8848
另外:
DWORD GetPrivateProfileString(
LPCTSTR lpAppName, // 你定义的段
LPCTSTR lpKeyName, // 你的键名
LPCTSTR lpDefault, // 没有键值时的默认值
LPTSTR lpReturnedString, // char buff[xx]
DWORD nSize, // xxx
LPCTSTR lpFileName // 配置文件路径(完整路径)
);
WritePrivateProfileString:和上面的差不多,如果将 Private 去掉,可以不加路径(只写文件名),
函数自动到windows的默认路径搜索文件名
追问
关键问题不在于读取,而在于如何关联?
C++里声明一组常量,常量名和我要导入的文本里=号左值一样。
比如文本内容为:
one = 100;
那么我希望在代码里,可直接调用 MyClass::one.getName()获得一个"one"的字符串,MyClass::one.getValue()获得100这个值。
追答
那就看你想把它做得多复杂了,按照你的思路,你可以写一个基类,像下面这样:
class PropertyBase
{
public:
PropertyBase()
{
memset(propertyName, '\0', sizeof(propertyName));
};
virtual int getValue();
Protected:
char propertyName[100];
char appName[100];
char fileName[100];
}
然后,你必须为每个属性写一个实体类,如:
class One : public PropertyBase
{
public:
One(char* propertyName)
{
strncpy(propertyName, propertyName, sizeof(propertyName));
};
virtual int getValue() // 重载getValue()函数
{
char returnedString[100];
memset(returnedString, '\0', sizeof(returnedString));
GetPrivateProfileString("yourProgram.exe", propertyName, "", returnedString, sizeof(returnedString), fileName);
return atoi(returnedString);
};
}
这样,你就可以这样调用了:
MyClass::one.getValue()
但是我在想,你是否有必要为了这点便利性来为每个属性实现一个类了。
这属于设计方面的问题:过渡设计!
展开全部
首先你要搞清楚变量名只是个名字,和字符串没有任何关系。变量名在机器中没有任何表示 只有变量存储一个内存地址,你不能指望机器能识别你定义的变量名。其次枚举的用法你没有弄明白,枚举的元素不等于类对象。你不能用枚举元素来进行类操作。
合理的方式是定义一个类对象,根据类对象进行操作。给你个合理的设计建议:
类对象可以读取文本中所有的字符串和常量,用于查找:
list<string> MyClass::getAllNames() const;
list<int> MyClass::getAllValues() const;
其次实例对象根据值或者字符串进行查找:
string MyClass::getName(int _value) const;
int MyClass::getValue(string _name) const;
合理的方式是定义一个类对象,根据类对象进行操作。给你个合理的设计建议:
类对象可以读取文本中所有的字符串和常量,用于查找:
list<string> MyClass::getAllNames() const;
list<int> MyClass::getAllValues() const;
其次实例对象根据值或者字符串进行查找:
string MyClass::getName(int _value) const;
int MyClass::getValue(string _name) const;
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
char strBuf = fgetline(...);
int ret = strncmp("string1", strbuf, strlen("string1"));
if(ret == 0 &&strBuf[strlen("string1"+1] = '=')
{
//得到那个数字
}
只是写了下思路,你详细一下就可以实现
int ret = strncmp("string1", strbuf, strlen("string1"));
if(ret == 0 &&strBuf[strlen("string1"+1] = '=')
{
//得到那个数字
}
只是写了下思路,你详细一下就可以实现
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2012-12-12 · 知道合伙人软件行家
关注
展开全部
GetPrivateProfileString 你查一下这个函数,就会发现它已经完成你所想要的功能
对应的 WritePrivateProfileString
对应的 WritePrivateProfileString
追问
关键问题不在于读取,而在于如何关联?
C++里声明一组常量,常量名和我要导入的文本里=号左值一样。
比如文本内容为:
one = 100;
那么我希望在代码里,可直接调用 MyClass::one.getName()获得一个"one"的字符串,MyClass::one.getValue()获得100这个值。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
楼主的意思含糊,看大概是不是这样:
struct Value
{
const char* Name;
int nValue;
};
#define DEFV(name) Value name = { #name, 0 }
namespace MyClass
{
DEFV(string1);
DEFV(string2);
DEFV(string3);
DEFV(string4);
};
然后读取配置文件中的值,伪代码:MyClass::string1.nValue = readIntFromTxt(MyClass::string1.Name);
struct Value
{
const char* Name;
int nValue;
};
#define DEFV(name) Value name = { #name, 0 }
namespace MyClass
{
DEFV(string1);
DEFV(string2);
DEFV(string3);
DEFV(string4);
};
然后读取配置文件中的值,伪代码:MyClass::string1.nValue = readIntFromTxt(MyClass::string1.Name);
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询