2

我试图通过从文本文件中将 Vector2 作为字符串读取然后解析它来将 Vector2 加载到我的游戏中。但是当我尝试加载这些信息时,我得到了这个异常:

格式异常未处理。输入字符串的格式不正确。

文本文件:

{X:512 Y:384}

代码:

System.IO.StreamReader objReader;
objReader = new System.IO.StreamReader(@fileName + ".txt");

string pos = objReader.ReadLine();

float aXPosition = float.Parse(pos.Substring(pos.IndexOf("X:"), pos.IndexOf(" Y")));
float aYPosition = float.Parse(pos.Substring(pos.IndexOf("Y:"), pos.IndexOf("}")));

所以我想做的是从文本文件中读取 X 和 Y 位置。我在这里找到了这种技术:http: //social.msdn.microsoft.com/Forums/sk/xnagamestudioexpress/thread/fd94cfec-f1f4-4cab-aa1d-8c72b524875b

看起来很简单,但由于某种原因它不适合我。任何帮助将非常感激!

4

3 回答 3

3

我认为你应该XmlSerializer改用它,它会少很多工作。

例如:

class MySaveGame
{
    public Vector2 Point1 { get; set; }
    public Vector2 Point2 { get; set; }
}

保存:

XmlSerializer serializer = new XmlSerializer(typeof(MySaveGame));
using (var stream = File.Create(@"C:\yourpath.xml"))
{
    serializer.Serialize(stream, new MySaveGame { Point1 = new Vector2(3, 3) });
}

读书:

using (var stream = File.OpenRead(@"C:\yourpath.xml"))
{
    var mySave = serializer.Deserialize(stream) as MySaveGame;
}

那是我的头顶,请仔细检查我的代码

于 2012-06-23T15:09:46.817 回答
2

这可能是因为在X 中为您提供了XIndexOf的索引您已在参数中指定。尝试这样的事情:

System.IO.StreamReader objReader;
objReader = new System.IO.StreamReader(@fileName + ".txt");

string pos = objReader.ReadLine();

int startInd = pos.IndexOf("X:") + 2;
float aXPosition = float.Parse(pos.Substring(startInd, pos.IndexOf(" Y") - startInd));
startInd = pos.IndexOf("Y:") + 2;
float aYPosition = float.Parse(pos.Substring(startInd, pos.IndexOf("}") - startInd));

更新

我已经测试了代码,并且方法的 count 参数也存在问题Substring。它应该指示子字符串的长度,而不是原始字符串中的结束索引。我更新了代码,所以它现在应该可以正常工作了。

于 2012-06-23T15:08:43.440 回答
0

格式异常未处理。输入字符串的格式不正确。

您收到此异常是因为您试图解析一个不是浮点数的字符串表示形式的字符串。

String.Substring MSND 文档说:

从此实例中检索子字符串。子字符串从指定的字符位置开始并具有指定的长度。

第二个参数是您要提取的字符串的长度,而不是停止提取的索引,它解释了您的问题。

实际上:

给定这个字符串{X:512 Y:384}, pos.IndexOf("X:")= 1, pos.IndexOf(" Y")= 6

=>pos.Substring(pos.IndexOf("X:"), pos.IndexOf(" Y"))

=>pos.Substring(1 , 6)

=>X:512这不是浮点数!

回到您的问题的解决方案

  1. 清除所有非数字字符中的字符串(中间留空格)
  2. 结果字符串现在应该只包含您想要的值和中间的空格
  3. 拆分你的字符串。您现在有一个包含 2 个字符串的数组,其中包含您想要的值,只需解析它们即可。

这是执行此操作的示例代码:

                                               //"{X:512 Y:384}"
String cleanString = pos.Replace("{X:", "");   //"512 Y:384}"
cleanString = cleanString .Replace("Y:", "");  //"512 384}"
cleanString = cleanString .Replace("}", "");   //"512 384"
String[] xyVals = cleanString.Split(' ');      //"512" and "384"
float aXPosition = float.Parse(xyVals[0]);
float aYPosition = float.Parse(xyVals[1]);
于 2012-06-23T15:16:36.480 回答