提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
之前在学习labview、matlab和C#做上位机的过程中使用ini配置文件写一些程序运行需要的参数,挺方便的,这里记录一下。本人是刚接触这三个的纯小白,刚自学没多久自己摸索的写出来的,有问题的话请大佬指正!谢谢!
环境:
Labview13.0
Matlab R2019b
Visual Studio 2022
先介绍一下ini文件中的存储格式,如图中的“作者”是段,“第一作者”与“第二作者”是键,实际内容“大帅逼1”与“大帅逼2”是值。当然不得不承认,我的读者们,你!我的朋友!是比我帅那么一丢丢的!
一、Labview13.0
先将读写子Vi做出来。
下图为上图后面板。
以上的Labview子Vi均可在后面板右键-文件I/O-配置文件VI找到。
下图为实际使用效果:
后面板程序:
前面板效果:
二、Matlab R2019b
1.WriteParameter
Matlab的ini文件写入代码如下:
function WriteParameter(Parameter_Name, Parameter)
Replace = 0;
% 判断是否为数字类型,是的话进行数字-字符转换
if isnumeric(Parameter)
Parameter = num2str(Parameter);
end
filename = strcat(pwd, '\', 'Setting.ini');
if isfile(filename)
fileID = fopen(filename, 'r');
lines = 0;
while ~feof(fileID)
PathResults = fgetl(fileID); %逐行读取原始文件
if PathResults ~= -1 %读取不为空值
lines = lines + 1;
newline{lines} = PathResults; %创建新对象接受原始文件每行数据
PathFileName = strsplit(PathResults, '='); %拆分成参数名字与参数
if strcmp(strtrim(PathFileName{1}), Parameter_Name) %写入的参数是否存在
newline{lines} = strrep(PathResults, strtrim(PathFileName{2}), Parameter); %替换函数,将参数更新
Replace = 1;
end
end
end
fclose(fileID); %关闭文件
end
if Replace %是否存在该参数
fileID = fopen(filename,'w'); %以写的方式打开输出文件,文件若存在则清空文件内容从文件头部开始写,若不存在则根据文件名创建新文件并只写打开
for k = 1 : lines
fprintf(fileID,'%s\n',newline{k}); %将newline内的内容逐行写出,更新该参数
end
fclose(fileID); %关闭文件
else
fileID = fopen(filename, 'a'); %在打开的文件末端添加数据。文件不存在则创建。
fprintf(fileID, '%s %s %s\n', Parameter_Name, '=', Parameter); %将不存在的参数进行写入
fclose(fileID); %关闭文件
end
end
WriteParameter(Parameter_Name, Parameter)的第一个参数为写入的键,第二个参数为写入的值,我没有将段也加入进去。
2.ReadParameter
Matlab的ini文件读取代码如下:
function Results = ReadParameter(Parameter_Name)
Exist = 0;
filename = strcat(pwd, '\', 'Setting.ini');
if isfile(filename)
fileID = fopen(filename, 'r');
lines = 0;
while ~feof(fileID)
PathResults = fgetl(fileID); %逐行读取原始文件
if PathResults ~= -1 %读取不为空值
lines = lines + 1;
PathFileName = strsplit(PathResults, '='); %拆分成参数名字与参数
if strcmp(strtrim(PathFileName{1}), Parameter_Name) %写入的参数是否存在
Results = strtrim(PathFileName{2});
Exist = 1;
end
end
end
fclose(fileID); %关闭文件
else
Exist = -1;
end
if Exist == 1
% 判断是否存在字符any(或|)、all(与&)
IsChar = any(isletter(Results));
% 不存在字符则纯数字,进行字符-数字转换
if ~IsChar
Results = str2double(Results);
end
elseif Exist == 0
Results = 0;
disp(strcat('文件不存在该参数:', Parameter_Name, '!'));
elseif Exist == -1
Results = 0;
disp('文件不存在!');
end
end
ReadParameter(Parameter_Name)的第一个参数和上面的WriteParameter对应为需要读取值的键,而Results为读取出来的值。
三、Visual Studio 2022(C#)
C#的ini文件写入读取代码如下:
public class IniFiles
{
//声明API函数
[DllImport("kernel32")]
private static extern long WritePrivateProfileString(string section, string key, string val, string filePath);
[DllImport("kernel32")]
private static extern int GetPrivateProfileString(string section, string key, string def, StringBuilder retVal, int size, string filePath);
/// <summary>
/// 写入INI文件 写入字符串类型
/// </summary>
/// <param name="Section">项目名称(如 [TypeName] )</param>
/// <param name="Key">键</param>
/// <param name="Value">值</param>
public static void WriteParameter(string Section, string Key, string Value)
{
WritePrivateProfileString(Section, Key, Value, ZJR.INIPath);//ZJR.INIPath为ini文件路径
}
/// <summary>
/// 写入INI文件重构 写入整数类型
/// </summary>
/// <param name="Section">项目名称(如 [TypeName] )</param>
/// <param name="Key">键</param>
/// <param name="Value_int">值</param>
public static void WriteParameter(string Section, string Key, int Value_int)
{
string Value = Value_int.ToString();
WritePrivateProfileString(Section, Key, Value, ZJR.INIPath);//ZJR.INIPath为ini文件路径
}
/// <summary>
/// 读出INI文件
/// </summary>
/// <param name="Section">项目名称(如 [TypeName] )</param>
/// <param name="Key">键</param>
public static dynamic ReadParameter(string Section, string Key)
{
StringBuilder temp = new StringBuilder(500);
int i = GetPrivateProfileString(Section, Key, "", temp, 500, ZJR.INIPath);//ZJR.INIPath为ini文件路径
if (isPureNum(temp.ToString()))
{
return int.Parse(temp.ToString());
}
else
{
return temp.ToString();
}
}
/// <summary>
/// 验证文件是否存在
/// </summary>
/// <returns>布尔值</returns>
public static bool ExistINIFile()
{
return File.Exists(ZJR.INIPath);//ZJR.INIPath为ini文件路径
}
//判断字符串是否纯数字
public static bool isPureNum(string str)
{
if (str.Length == 0 || str == null)//验证这个字符串是否为空
{
return false;
}
byte[] strBytes = Encoding.ASCII.GetBytes(str);//获取字符串的byte类型的字符数组,编码方式ASCII
foreach (byte strByte in strBytes)
{
if ((strByte < 48) || (strByte > 57)) //判断每个字符是否为数字,根据每个字符的ASCII值所在范围判断
{
return false; //不是,就返回false
}
}
return true; //是,就返回true
}
}
总结
提示:这里对文章进行总结:
各位吴彦祖们学废了嘛,简单的一个应用,记录一下。如有不足请指正,谢谢!