配置文件的读写.txt .dat .ini


大多程序都会用到配置文件来动态读写一些东西,比较高级的点的就是xml,具体使用方法见我博客关于xml配置文件的文章。

这里主要为大家总结一下文本文档的配置文件读写,适合任何后缀,.txt .dat .ini .exe(修改txt) 甚至可以没有后缀,只要内容符合一定格式:

[section]

keyname1 = value1

keyname2 = value2

其余的格式自由发挥


以下是我用到的一个例子,后缀为.dat:

license.dat

#----------------------------------------------------------------------------------------------------
#     license 软件模块授权文件开始
#----------------------------------------------------------------------------------------------------


#    客户名称:航天XX研究所
#    客户地址:北京市丰台区1234567
#    联系人:ABC
#    联系方式:DEF
#    其他:


服务器MAC:12-34-56-78-90-AB-CD
服务器主硬盘ID:1234567890ABCDEFG


#----------------------------------------------------------------------------------------------------
#   License 软件模块及授权信息
#----------------------------------------------------------------------------------------------------


[模块1]
模块名称    = CableFastDesign
数量        = 3
有效期限    = 2015-12-31
版本        = 2.X
授权码      = 123456789EFGHJKLABCD


[模块2]
模块名称    = LAMCTools
数量        = 4
有效期限    = 2015-10-01
版本        = 1.X
授权码      = 123456789EFGHJKLABCD




[模块3]                              /*section*/
模块名称    = 3DDimension           /*keyname = value  nDefault是再找不到该keyname时的默认值*/  
数量        = 9
有效期限    = 2015-10-01
版本        = 1.X
授权码      = 89EFGHJ1234567KLABCD
#----------------------------------------------------------------------------------------------------
#   License 软件模块授权文件结束
#----------------------------------------------------------------------------------------------------


该方法主要用到以下类型函数,大家可以到msdn中查找具体函数解释:


可以读取int、 float、 bool、 string类型变量,以读int为例:

UINT GetPrivateProfileInt(  LPCTSTR lpAppName,  // 
  LPCTSTR lpKeyName,  // key name
  INT nDefault,       // return value if key name not found
  LPCTSTR lpFileName  // initialization file name);

写入int、 float、 bool、 string类型变量,以string为例:

BOOL WritePrivateProfileString(  LPCTSTR lpAppName,  // section name
  LPCTSTR lpKeyName,  // key name  
  LPCTSTR lpString,   // string to add
  LPCTSTR lpFileName  // initialization file);


以下是以C++实现的源码,稍改以下C也可以:

IniReader.h

#ifndef INIREADER_H
#define INIREADER_H
class CIniReader
{
public:
	CIniReader(char* szFileName); 
	int ReadInteger(char* szSection, char* szKey, int iDefaultValue);
	float ReadFloat(char* szSection, char* szKey, float fltDefaultValue);
	bool ReadBoolean(char* szSection, char* szKey, bool bolDefaultValue);
	char* ReadString(char* szSection, char* szKey, const char* szDefaultValue);
private:
	char m_szFileName[255];
};
#endif//INIREADER_H

IniReader.cpp

#include "stdafx.h"
#include "IniReader.h"
#include <iostream>
#include <Windows.h>

CIniReader::CIniReader(char* szFileName)
{
	memset(m_szFileName, 0x00, 255);
	memcpy(m_szFileName, szFileName, strlen(szFileName));
}
int CIniReader::ReadInteger(char* szSection, char* szKey, int iDefaultValue)
{
	int iResult = GetPrivateProfileInt(szSection,  szKey, iDefaultValue, m_szFileName); 
	return iResult;
}
float CIniReader::ReadFloat(char* szSection, char* szKey, float fltDefaultValue)
{
	char szResult[255];
	char szDefault[255];
	float fltResult;
	sprintf(szDefault, "%f",fltDefaultValue);
	GetPrivateProfileString(szSection,  szKey, szDefault, szResult, 255, m_szFileName); 
	fltResult =  atof(szResult);
	return fltResult;
}
bool CIniReader::ReadBoolean(char* szSection, char* szKey, bool bolDefaultValue)
{
	char szResult[255];
	char szDefault[255];
	bool bolResult;
	sprintf(szDefault, "%s", bolDefaultValue? "True" : "False");
	GetPrivateProfileString(szSection, szKey, szDefault, szResult, 255, m_szFileName); 
	bolResult =  (strcmp(szResult, "True") == 0 || 
		strcmp(szResult, "true") == 0) ? true : false;
	return bolResult;
}
char* CIniReader::ReadString(char* szSection, char* szKey, const char* szDefaultValue)
{
	char* szResult = new char[255];
	memset(szResult, 0x00, 255);
	GetPrivateProfileString(szSection,  szKey, 
		szDefaultValue, szResult, 255, m_szFileName); 
	return szResult;
}


IniWriter.h

#ifndef INIWRITER_H
#define INIWRITER_H
class CIniWriter
{
public:
	CIniWriter(char* szFileName); 
	void WriteInteger(char* szSection, char* szKey, int iValue);
	void WriteFloat(char* szSection, char* szKey, float fltValue);
	void WriteBoolean(char* szSection, char* szKey, bool bolValue);
	void WriteString(char* szSection, char* szKey, char* szValue);
private:
	char m_szFileName[255];
};
#endif //INIWRITER_H


IniWriter.cpp

#include "stdafx.h"
#include "IniWriter.h"
#include <iostream>
#include <Windows.h> 
CIniWriter::CIniWriter(char* szFileName)
{
	memset(m_szFileName, 0x00, 255);
	memcpy(m_szFileName, szFileName, strlen(szFileName));
}
void CIniWriter::WriteInteger(char* szSection, char* szKey, int iValue)
{
	char szValue[255];
	sprintf(szValue, "%d", iValue);
	WritePrivateProfileString(szSection,  szKey, szValue, m_szFileName); 
}
void CIniWriter::WriteFloat(char* szSection, char* szKey, float fltValue)
{
	char szValue[255];
	sprintf(szValue, "%f", fltValue);
	WritePrivateProfileString(szSection,  szKey, szValue, m_szFileName); 
}
void CIniWriter::WriteBoolean(char* szSection, char* szKey, bool bolValue)
{
	char szValue[255];
	sprintf(szValue, "%s", bolValue ? "True" : "False");
	WritePrivateProfileString(szSection,  szKey, szValue, m_szFileName); 
}
void CIniWriter::WriteString(char* szSection, char* szKey, char* szValue)
{
	WritePrivateProfileString(szSection,  szKey, szValue, m_szFileName);
}

如果有更好的方法请务必留下地址或者留言告知,互相学习

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 ESP32 上使用 LittleFS 文件系统读写 `.ini` 文件可以按照以下步骤进行: 1. 挂载 LittleFS 文件系统 在开始读写之前,需要先挂载 LittleFS 文件系统。可以使用 `LittleFS.begin()` 方法来挂载文件系统。示例代码如下: ```c++ #include <LittleFS.h> void setup() { LittleFS.begin(); // 其他初始化代码 } ``` 2. 创建 `.ini` 文件 在 LittleFS 文件系统中创建 `.ini` 文件。可以使用 `LittleFS.open()` 方法创建文件并写入配置信息。示例代码如下: ```c++ #include <LittleFS.h> void setup() { LittleFS.begin(); File file = LittleFS.open("/config.ini", "w"); file.println("[wifi]"); file.println("ssid=your_ssid"); file.println("password=your_password"); file.close(); // 其他初始化代码 } ``` 3. 读取 `.ini` 文件 在需要读取配置信息的地方,可以使用 `LittleFS.open()` 方法打开 `.ini` 文件,并使用 `readLine()` 方法逐行读取文件内容。示例代码如下: ```c++ #include <LittleFS.h> void setup() { LittleFS.begin(); // 其他初始化代码 } void loop() { File file = LittleFS.open("/config.ini", "r"); String line; while (file.available()) { line = file.readStringUntil('\n'); // 处理读取到的配置信息 } file.close(); // 其他代码 } ``` 4. 修改 `.ini` 文件 如果需要修改配置信息,可以使用 `LittleFS.open()` 方法打开 `.ini` 文件,并使用 `write()` 方法将修改后的内容写入文件。示例代码如下: ```c++ #include <LittleFS.h> void setup() { LittleFS.begin(); // 其他初始化代码 } void loop() { File file = LittleFS.open("/config.ini", "r+"); String line; while (file.available()) { line = file.readStringUntil('\n'); if (line.startsWith("password=")) { // 修改密码 line = "password=new_password"; } file.write(line.c_str(), line.length()); } file.close(); // 其他代码 } ``` 注意,LittleFS 文件系统的 API 与标准的文件操作 API 不同,需要仔细阅读 LittleFS 的文档并按照 API 使用方法进行操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值