C# 读取ini文件里的内容

Flandre 2015-09-19 09:46:28
用的是使用window的api导入dll读取的方式,写了一个GetConfig()的函数,在这个函数里使用GetPrivateProfileString()方法读值是没有问题的,但是如果我把GetPrivateProfileString()方法写到另一个函数SetDouble(string str,double dnum)里,其中str作为GetPrivateProfileString()方法string key的参数,dnum是我要获取的值,在GetConfig()函数里使用SetDouble(string str,double dnum),就会发现读不到值,可能说的绕,下面贴上代码


[DllImport("kernel32")]
private static extern int GetPrivateProfileString(string section,
string key, string def, StringBuilder retVal,
int size, string filePath);

string szConfig;
string szDirectory = Environment.CurrentDirectory;
double dnum;
double dnumok;

private void GetConfig()
{
szConfig = szDirectory + @"\config.ini";
StringBuilder sbtemp = new StringBuilder();
GetPrivateProfileString("Section", "doubleok", "0.0", sbtemp, 20, szConfig);
dnumok = Convert.ToDouble(sbtemp.ToString()); //这里是没有问题的,可以读到值

SetDouble("dnum",dnum);
MessageBox.Show(dnum.ToString()); //发现dnum全是0,读不到ini文件里的值

// SetDebug(); //如果直接在该函数里把string key直接进去,发现可以读到ini文件里的值
}

public void SetDouble(string strkey, double dnum)
{
StringBuilder sbtmp = new StringBuilder();
GetPrivateProfileString("Section", strkey, "0.0", sbtmp, 20, szConfig);
dnum= Convert.ToDouble(sbtmp.ToString());
}

public void SetDebug()
{
StringBuilder sbtmp = new StringBuilder();
GetPrivateProfileString("Section", "dnum", "0.0", sbtmp, 20, szConfig);
dnum= Convert.ToDouble(sbtmp.ToString());
}



代码重新简写了一下,可能有些错误没检查到,不是直接贴的,大概就是上面那段代码表达的意思,GetPrivateProfileString()中第二个参数string key,作为自定义函数的参数传进去,在函数的函数里调用就发现读不到值
...全文
678 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
xuzuning 2015-09-30
  • 打赏
  • 举报
回复
ini 文件中含有分组标记([])、注释(") 和 为防止歧义的引号(") 所以解析是还是写的规范些比较好
大然然 2015-09-30
  • 打赏
  • 举报
回复
File.read,在解析吧
於黾 2015-09-30
  • 打赏
  • 举报
回复
不要把ini文件当数据库来检索 你不如在初始化的时候把文件里的东西都读出来,放到字典里 而不是每当要用值的时候都重新去读文件
devmiao 2015-09-20
  • 打赏
  • 举报
回复
ini就是文本文件,直接读取
crystal_lz 2015-09-20
  • 打赏
  • 举报
回复
- -!。。。。从来都是自己读取文本文件的路过 文件内容 ===== abc:111 efg:423 test:erew =====

public class ConfigHelper{
    private string m_strConfig;
    public ConfigHelper(string strFileName){ m_strConfig = File.ReadAllText();}
    
    public string GetValueFromKey(stirng strKey){
       return Regex.Match(m_strConfig,strKey + ":\s*([^ ]+)").Groups[1].Value
    }
}
调用的时候
ConfigHelper ch = new ConfigHelper("your file");
double d = double.Parse(ch.GetValueFromKey("abc"));
直回复框里面手打的代码 可能有错 只是给你一个思路而已 没有必要搞得那么复杂
本拉灯 2015-09-19
  • 打赏
  • 举报
回复


public class IniFile
    {

        private string path;
        [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);

        public IniFile(string fileName)
        {

            path = fileName;

        }
        public void IniWriteValue(string Section, string Key, string Value)
        {
            WritePrivateProfileString(Section, Key, Value, this.path);
        }

        public string IniReadValue(string Section, string Key)
        {
            StringBuilder temp = new StringBuilder(500);
            int i = GetPrivateProfileString(Section, Key, "", temp, 500, this.path);
            return temp.ToString();
        }


        public string ReadString(string Section, string Key)
        {
            return IniReadValue(Section, Key);
        }

        public bool ReadBoolean(string Section, string Ident, bool Default)
        {
            try
            {
                return Convert.ToBoolean(this.ReadString(Section, Ident));
            }
            catch (Exception exception)
            {
                return Default;
            }
        }


        public int ReadInteger(string Section, string Ident, int Default)
        {
            string str = this.ReadString(Section, Ident);
            try
            {
                return Convert.ToInt32(str);
            }
            catch (Exception exception)
            {
                return Default;
            }
        }

        public void WriteBool(string Section, string Ident, bool Value)
        {
            this.WriteString(Section, Ident, Convert.ToString(Value));
        }

        public void WriteInteger(string Section, string Ident, int Value)
        {
            this.WriteString(Section, Ident, Value.ToString());
        }

        public void WriteString(string Section, string Ident, string Value)
        {
            this.IniWriteValue(Section, Ident, Value);
        }
    }

Flandre 2015-09-19
  • 打赏
  • 举报
回复
我简化描述一下我的问题 现有一个函数 public void setmcu1(string keystr, double dmcu) { StringBuilder sbtmp = new StringBuilder(); GetPrivateProfileString("MCU1", keystr, "0.0", sbtmp, 20, szConfig); dmcu = Convert.ToDouble(sbtmp.ToString()); } 发现调用该函数的时候keystr传不到GetPrivateProfileString()里面,dmcu读不到值,结果是0,请问如何通过函数给GetPrivateProfileString传递参数 string key
Flandre 2015-09-19
  • 打赏
  • 举报
回复
引用 1 楼 AAA123524457 的回复:
搞的有点复杂了~~ 又要导入kernel32,又要写一大堆函数什么的。我是觉得没必要了。 还不如直接用streamread,把文件内容读到数据流,再根据文件的内容进行解析就好了。反正文件内容又不是加密的。你就把它当作一个普通的文件来读取就好了。
我这么做的目的是怕搞乱,因为我有一百多个double变量要从ini文件里读出来,所以才这么做的,想把两条读值语句放到一个方法里然后传参给GetPrivateProfileString()方法,这样写起来不容易搞错,看的也清晰,结果发现不行,参数传不到GetPrivateProfileString()里面去,郁闷
啊拉丁的鱼 2015-09-19
  • 打赏
  • 举报
回复
搞的有点复杂了~~ 又要导入kernel32,又要写一大堆函数什么的。我是觉得没必要了。 还不如直接用streamread,把文件内容读到数据流,再根据文件的内容进行解析就好了。反正文件内容又不是加密的。你就把它当作一个普通的文件来读取就好了。

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧