读取类INI文件时Write/WriteLine异常及参数解析需求
解决INI格式文件读取的异常问题
看起来你遇到的问题主要来自三个点:
- 代码存在语法错误:while块里的大括号嵌套混乱,导致逻辑执行顺序出错
- 读取到
[section]这类没有=的行时,用Split('=')得到的数组只有1个元素,此时访问values[1]会直接抛出索引越界异常 - 如果文件里有空行,
inputLine会是空字符串,这时访问inputLine[0]会触发参数越界异常,这也是你尝试Console.Write(inputLine[0])报错的原因
结合你的需求——通过char.IsLetter(inputLine[0])判断行首是否为字母,若是则跳过该行,仅读取键值对参数,这里是修正后的完整代码:
string inputLine; // 读取文件直到末尾 while ((inputLine = sr.ReadLine()) != null) { // 先跳过空行或全是空白的行,避免访问空字符串索引 if (string.IsNullOrWhiteSpace(inputLine)) continue; // 按照需求:行首是字母则跳过该行 if (char.IsLetter(inputLine[0])) continue; // 可选:如果需要跳过[section]行,可以添加这行判断 // if (inputLine.StartsWith("[")) // continue; // 先检查行中是否包含=,避免无=的行引发Split后索引越界 if (inputLine.Contains("=")) { // 只分割第一个=,避免值里包含=时被错误分割 string[] values = inputLine.Split(new char[] { '=' }, 2); // 确保分割后至少有两个有效元素 if (values.Length >= 2) { string param = values[0].Trim(); // 去除参数名前后的空格 string value = values[1].Trim(); // 去除值前后的空格 Console.WriteLine($"参数:{param},值:{value}"); } } }
关键优化说明:
- 修复语法错误:调整了while块的大括号结构,确保逻辑按预期顺序执行
- 空行安全处理:用
string.IsNullOrWhiteSpace跳过空行或全空白行,彻底避免空字符串索引访问异常 - 精准分割:给
Split方法传入2作为第二个参数,只分割第一个=符号,防止值内容里包含=时被误拆分 - 多层安全检查:先判断行是否包含
=,再执行分割;分割后检查数组长度,确保不会访问不存在的索引 - 灵活适配需求:保留了你要求的行首字母判断逻辑,同时添加了可选的section行跳过逻辑,你可以根据实际情况开启
这样修改后,不管文件里有没有[section]行、空行,都能安全稳定地读取符合格式的键值对参数了。
内容的提问来源于stack exchange,提问作者Bersekz
相关产品推荐
相关产品推荐

