C# 尝试运行程序时出现格式错误

C# 尝试运行程序时出现格式错误,c#,formatexception,C#,Formatexception,所以,今天我尝试制作一个应用程序,用户在其中输入他们汽车的坐标,该应用程序计算在油箱用完之前到达加油站的最简单方式。但是当我想测试应用程序是否显示存储在.txt文件中的数据时,我得到了一个无法解决的System.FormatException错误。我以前用过很多次这种方法,我不确定这里有什么问题 错误发生在以下行: int xcoor = int.Parse(s.Substring(k + 1)); 代码: 提前感谢, Blaise中间子字符串调用没有任何长度,因此它占用了该行的其余部分 in

所以,今天我尝试制作一个应用程序,用户在其中输入他们汽车的坐标,该应用程序计算在油箱用完之前到达加油站的最简单方式。但是当我想测试应用程序是否显示存储在.txt文件中的数据时,我得到了一个无法解决的System.FormatException错误。我以前用过很多次这种方法,我不确定这里有什么问题

错误发生在以下行:

int xcoor = int.Parse(s.Substring(k + 1));
代码:

提前感谢,


Blaise

中间子字符串调用没有任何长度,因此它占用了该行的其余部分

int xcoor=int.Parses.Substringk+1,/*缺少长度*/; 但是,请使用CSV解析器。没有理由在每次需要时都重新发明轮子

编辑 我只是注意到你得到了相同的指数;进入k和k2,所以它根本不起作用。 同样,使用CSV解析器

编辑2 如果您不使用CSV解析器,这里有一个@ADyson建议的拆分解决方案:

对于int i=0;i失败与行中的子字符串一起出现

int xcoor = int.Parse(s.Substring(k + 1));
您正试图解析为int值150;30很明显,它不能被解析为一个数字

我建议将每一行拆分为:;获取每个位置的值

您可以在for循环内部执行此操作:

字符串[]行=s.拆分;; var city=line[0]; var xcoor=int.Parseline[1]; var ycoor=int.Parseline[2]; 城市=城市; x[i]=xcoor; y[i]=ycoor; 编辑以添加使用子字符串的工作方式

方法接受两个参数:

1:是开始的位置。 第二:就是你想多得到多少个职位

所以,解决办法是得到所有的ondex;我使用了lambda表达式,然后以正确的方式使用了子字符串

也就是说:告诉程序从找到分号的地方开始,在找到下一个分号之前结束尽可能多的位置

var index=Regex.Matchess;。Cast.Selectm=>m.Index.ToList; var city=s.Substring0,索引[0]; var xcoor=s.子字符串索引[0]+1,索引[1]-索引[0]-1; var ycoor=s.substringindex[1]+1,s.Length-index[1]-1; 城市=城市; x[i]=int.Parsexcoor; y[i]=int.Parseycoor;
通过这段代码,您可以看到开始和“剪切”子字符串的位置。

除了使用现成的CSV/delmimited文件解析器执行此任务的一般建议外,您自己的代码大大使问题复杂化了,当试图检测分隔符的位置并计算它们之间字符串的正确长度时,会遇到各种逻辑缺陷

只使用这个方法要简单得多

此外,如果您打算将坐标与位置名称进行匹配,则由城市、x坐标和y坐标的单独数组组成的前进数据结构也没有多大意义-如果您想这样做,请将数据保存在一起。简单的对象结构将使以后的工作更容易。而且列表通常也比数组更容易使用

此外,为了简单起见,您应该只读取到文件的末尾,而不是特定的行数

最后,使用诸如StreamReader之类的一次性物品的最佳实践是,将其与a一起初始化,以确保事后妥善处理

e、 g

然后

using (System.IO.StreamReader sr = new new System.IO.StreamReader(@"..\..\CitiesGPS.txt", Encoding.GetEncoding(1250)))
{
  List<LocationData> locationList = new List<LocationData>();

  while ((s = sr.ReadLine()) != null)
  {
    string[] data = s.Split(';');
    LocationData loc = new LocationData()
    {
      Name = data[0],
      X = int.Parse(data[1]),
      Y = int.Parse(data[2])
    };
    locationList.Add(loc);
  }
}

foreach (LocationData loc in locationList)
{
    Console.WriteLine(loc.Name + ";" + loc.X + ";" + loc.Y);
}

p.S.使用string.split处理一行的超级简单演示:

在哪一行出现错误以及.txt文件如何?它可能是int.Parse调用之一;现在很难说。使用调试器或将代码包装在try/catch块中,并根据引发异常的行号输出异常。另外,不相关的,可以更容易地使用string.Split甚至CSV库来解析这些行。错误出现在第行:int xcoor=int.Parses.Substringk+1;删除了Parse并将其替换为Convert.ToInt32,但它仍然不起作用。表示当输入字符串的格式不正确时,可能会发生FormatException。因此,不管s.Substringk+1返回什么,它都不是一个有效的整数。使用调试器找出该表达式实际生成的内容。我们不能告诉您这一点,因为我们看不到您正在使用的任何数据。当我添加了长度-使用了0以便显示所有内容-问题仍然存在,但当我将0更改为1时,它开始工作,但它弄乱了数据:/Substringx,y表示:从从x开始的字符串中提取y个字符。当然,0和1都不起作用。@FábiánBalázs为什么要将长度更改为1?这毫无意义。您的数字都不是1个字符长。您需要将长度设置为第一个之间的距离;第二个;。或者只是做一些理智的事情,然后使用string.Split!!
int xcoor = int.Parse(s.Substring(k + 1));
public class LocationData
{
  public string Name {get; set;}
  public int X {get; set;}
  public int Y {get; set;}
}
using (System.IO.StreamReader sr = new new System.IO.StreamReader(@"..\..\CitiesGPS.txt", Encoding.GetEncoding(1250)))
{
  List<LocationData> locationList = new List<LocationData>();

  while ((s = sr.ReadLine()) != null)
  {
    string[] data = s.Split(';');
    LocationData loc = new LocationData()
    {
      Name = data[0],
      X = int.Parse(data[1]),
      Y = int.Parse(data[2])
    };
    locationList.Add(loc);
  }
}

foreach (LocationData loc in locationList)
{
    Console.WriteLine(loc.Name + ";" + loc.X + ";" + loc.Y);
}