使用StreamReader读取文本文件时持续报错“输入字符串格式不正确”
嘿,这个格式错误的问题我之前也碰到过,本质就是你从文件里读出来的字符串没办法被正确转换成数字类型——不管用Convert还是Parse都会踩这个坑,因为它们对数字格式的要求是一致的。我给你拆解几个最可能的原因和解决办法:
1. 先检查文件内容的格式问题
这是最常见的触发原因:
- 你默认用逗号分割,但文件里可能有多余的空格、制表符,比如某行是
" 256.8 , 1200 , MyBlog ",这些空格会让转换函数认不出有效数字; - 或者文件里存在空行、字段数量不足的行(比如某行只有两个逗号分隔的内容),导致
data[0]或data[1]是空字符串,转换直接报错。
解决办法:读取每行后先清理字符串,再加格式校验:
ArrayList Webpages = new ArrayList(); string FileName = "Medium.txt"; // 指定编码避免隐藏字符问题,比如UTF-8 using (StreamReader newSR = new StreamReader(FileName, System.Text.Encoding.UTF8)) { while (!newSR.EndOfStream) { string line = newSR.ReadLine(); // 跳过空行 if (string.IsNullOrWhiteSpace(line)) continue; // 分割后去掉每个字段的前后空格 string[] data = line.Split(',').Select(s => s.Trim()).ToArray(); // 检查字段数量是否足够 if (data.Length < 3) { Console.WriteLine($"跳过格式错误的行:{line}"); continue; } Webpage newEntry = new Webpage(); // 用TryParse安全转换,避免直接抛出异常 if (double.TryParse(data[0], System.Globalization.CultureInfo.InvariantCulture, out double size) && int.TryParse(data[1], out int visitCount)) { newEntry.size = size; newEntry.visitCount = visitCount; newEntry.name = data[2]; Webpages.Add(newEntry); } else { Console.WriteLine($"转换失败的行:{line},请检查数字格式"); } } }
2. 数字格式的区域文化冲突
比如你的系统默认用逗号做小数分隔符(比如欧洲地区),但文件里的数字是用点(123.45),这时候double.Parse会直接报错;反过来如果系统用点,文件里用逗号做小数位也会出问题。
解决办法:转换时指定不变文化(InvariantCulture),它会用点作为小数分隔符,不受系统区域设置影响,就是上面代码里用到的System.Globalization.CultureInfo.InvariantCulture。
3. 文件编码导致的隐藏特殊字符
有时候文件带BOM头(比如UTF-8 with BOM),用默认编码读取会带出隐藏的特殊字符,看起来字符串正常,但实际转换时会被判定为无效格式。
解决办法:打开文件时指定明确的编码,比如UTF8或者ASCII,根据你的文件实际情况选择。
最后提个小建议
尽量用TryParse替代Parse或Convert,它不会直接抛出异常,而是返回布尔值告诉你转换是否成功,同时输出转换后的结果,这样程序更健壮,还能快速定位错误行。
内容的提问来源于stack exchange,提问作者pops
相关产品推荐
相关产品推荐

