我有这样的功能:
List<float> myList = new List(float);
public void numbers(string filename)
{
string input;
float number;
if (System.IO.File.Exists(filename) == true)
{
System.IO.StreamReader objectReader;
objectReader = new System.IO.StreamReader(filename);
while ((input = objectReader.ReadLine()) != null)
{
number = Convert.ToSingle(input);
myList.Add(number);
}
objectReader.Close();
}
else
{
MessageBox.Show("No Such File" + filename);
}
}
我试图将文本文件中的数字(浮点数)添加到List中。但我一直在说错误的格式错误。文本文件中的数字是每行一个数字......任何帮助?
答案 0 :(得分:4)
我建议你像这样做一个Trim电话
number = Convert.ToSingle(input.Trim());
然而,更好的代码将使用TryParse调用
float tmp;
if(float.TryParse(input.Trim(), out tmp)
{
mylist.Add(tmp);
}
答案 1 :(得分:3)
你的代码对我来说没问题,除了换行的情况(当然对于完全不是数字的条目)
这是一个适合您的版本,使用tryParse检查每行是否可以转换为单个版本):
public void Numbers(string filename)
{
List<float> myList = new List<float>();
string input;
if (System.IO.File.Exists(filename) == true)
{
System.IO.StreamReader objectReader;
objectReader = new System.IO.StreamReader(filename);
while ((input = objectReader.ReadLine()) != null)
{
Single output;
if (Single.TryParse(input, out output ))
{
myList.Add(output);
}
else
{
// Huh? Should this happen, maybe some logging can go here to track down why you couldn't just use the .Convert()
}
}
objectReader.Close();
}
else
{
MessageBox.Show("No Such File" + filename);
}
}
正如Mike C正确指出的那样,这可能存在风险 - 吞噬已被输出过程破坏的良好数据。 tryParse方法在失败时返回false,因此您可以添加一个else分支和一些日志记录来检查导致失败的原因,并查看是否还有其他错误可以纠正。
答案 2 :(得分:0)
文件中是否有空行或转换失败?我的猜测是你有一条不能从其当前格式浮出的线。你应该确保在读取行之前清理行(使用正则表达式删除所有不是数字的行)并在检查失败时抛出行。
您可能会做的一件事是使用double而不是Convert.ToDouble()。
答案 3 :(得分:0)
是否有空格或逗号或其他内容?最好的办法是在
上设置断点number = Convert.ToSingle(input);
在尝试转换之前查看输入实际上是什么。
答案 4 :(得分:0)
有一个很棒的免费软件包FileHelpers,可以帮助从各种文本文件中导入数据。这样做的好处是已经有很多更深层次的错误处理。
答案 5 :(得分:0)