2

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

これはおそらく、 XXIndexOfのインデックスを提供するためです。パラメータで指定しました。次のようなものを試してください。

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));

アップデート

コードをテストしましたが、Substringメソッドのカウントパラメータにも問題がありました。元の文字列の終了インデックスではなく、サブ文字列の長さを示す必要があります。コードを更新したので、正しく機能するはずです。

于 2012-06-23T15:08:43.440 に答える
0

フォーマット例外は処理されませんでした。入力文字列は、正しい形式ではありませんでした。

floatの文字列表現ではない文字列を解析しようとしているため、この例外が発生します。

String.SubstringMSNDのドキュメントには次のように書かれています。

このインスタンスからサブストリングを取得します。サブストリングは、指定された文字位置から始まり、指定された長さを持ちます。

2番目のパラメーターは、抽出を停止するインデックスではなく、抽出する文字列の長さであり、問​​題を説明します。

実際には:

この文字列が与えられると{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 に答える