ini文件写入读出

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

之前在学习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
    }
}

总结

提示:这里对文章进行总结:
各位吴彦祖们学废了嘛,简单的一个应用,记录一下。如有不足请指正,谢谢!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值