2012-01-04 7 views
2

現在ゲームを行っていますが、テキストファイルから値を読み取る際に問題があるようです。何らかの理由で、私が値を読むと、ファイルに書き込んだときに実際の値そのものではなく、値のASCIIコードが得られます。私はすべてのASCII変換関数と文字列変換関数について試しましたが、わかりません。ファイルからintを読み取ると、ASCIIが返されます

私は整数の2次元配列を使用します。私はネストされたforループを使って各要素をファイルに書き出します。私はファイルを見て、値は正しいですが、私はなぜそれがASCIIコードを返すのか分かりません。

ファイル書き込みする:

for (int i = 0; i < level.MaxRows(); i++) 
{ 
    for (int j = 0; j < level.MaxCols(); j++) 
    { 
     fileWrite.Write(level.GetValueAtIndex(i, j) + " "); 
     //Console.WriteLine(level.GetValueAtIndex(i, j)); 
    } 

    //add new line 
    fileWrite.WriteLine(); 
} 

そして、ここでは、私は、ファイルから値を読み取るコードは次のとおりです。

string str = ""; 
int iter = 0; //used to iterate in each column of array 

for (int i = 0; i < level.MaxRows(); i++) 
{ 
    iter = 0; 
    //TODO: For some reason, the file is returning ASCII code, convert to int 
    //keep reading characters until a space is reached. 
    str = fileRead.ReadLine(); 

    //take the above string and extract the values from it. 
    //Place each value in the level. 
    foreach (char id in str) 
    { 
     if (id != ' ') 
     { 
      //convert id to an int 
      num = (int)id; 
      level.ChangeTile(i, iter, num); 
      iter++; 
     } 
    } 

これここで私が書くと、ファイルへの読み取りに使用しているコードです値を読み取るために使用するループの最新バージョンです。他の値を読み取っても問題ありません。それはちょうど私が配列に行くとき、事が間違って行く。私の質問は、なぜASCIIへの変換は起こったのでしょうか?それを理解できれば、問題を解決できるかもしれません。私は自分のゲームを作るためにXNA 4を使用しています。

答えて

4

アスキーにconvertionが起こっている場所です:

fileWrite.Write(level.GetValueAtIndex(i, j) + " "); 

あなたはそれを文字列に追加しているので、+演算子は、暗黙的に(実際に、あなたは何を期待してなかった、文字列にGetValueAtIndexによって返された整数に変換)

さらに、ReadLineメソッドはStringを返すので、なぜ数値が魔法のようにここに戻ってくるのかわかりません。あなたがバイナリデータを書き込みたい場合は、あなたが持っているBinaryWriter

+0

その答えの問題は、私がファイルに書き込む他の値があり、それを読み取ることができることです。混乱の原因となっているアレイの値だけです。私はそれがすべて文字列に変換されることを知っています。私は連結を削除し、私は同じ問題を抱えています。 – King

+0

level.GetValueAtIndex(i、j)はどのデータ型を返しますか?私はそれが整数であると仮定していた。 –

+0

fileWriteはどのようなタイプですか? –

0

に見て:

foreach (char id in str) 
{ 
    //convert id to an int 
    num = (int)id; 

char ASCIIコード(あるいは、そのようなとして考えることができるであり、技術的には、UnicodeのコードポイントでありますANSIまたは低価値のUTF-8を書いていると仮定すると、それは広く匹敵します)。何をしたい

は次のとおりです。

num = (int)(id - '0'); 
1

アップデート:私は1つのレコードが各ライン上にあったことを前提に(下)古いコードを守ってきたが、私はまた、別の方法を追加しましたスペースで区切られた1行の複数の整数で動作するはずです。 1行

str = fileRead.ReadLine(); 

string[] values = str.Split(new Char[] {' '}); 

foreach (string value in values) 
{ 
    int testNum; 

    if (Int32.TryParse(str, out testnum)) 
    { 
     // again, not sure how you're using iter here 
     level.ChangeTile(i, iter, num); 
    } 
} 

1つのレコード行ごとに

複数のレコード

str = fileRead.ReadLine(); 

int testNum; 

if (Int32.TryParse(str, out testnum)) 
{ 
    // however, I'm not sure how you're using iter here; if it's related to 
    // parsing the string, you'll probably need to do something else 
    level.ChangeTile(i, iter, num); 
} 

あなたはそれぞれの整数のライン・バイ・ラインを書き出す場合は、上記の(動作する必要があることに注意してくださいつまり、上記のコードで書き出したWriteLineを使ってどのようにしていたのか)。 WriteLineを使用するように切り替えると、これはうまくいくはずです。

+0

@Kingは物事の見た目で各行に複数のレコードを持っています。 –

+0

@Chris Shain合意しましたが、ある時点では行単位で書き込まれていました(つまり、コメントアウトされたWriteLine)。私は私の答えでそれをより明確にするでしょう。 –

0

この:

fileWrite.Write(level.GetValueAtIndex(i, j) + " "); 

intを文字列にlevel.GetValueAtIndex(i, j)から返さ変換します。この関数が特定のijの値5を返したとすると、ファイルに "5"を書きます。

文字列で読み込まれている文字列は、5のASCIIコードをintに単純にキャストすると読み取られます。あなたが必要とするのは:

foreach (char id in str) 
{ 
    if (id != ' ') 
    { 
     //convert id to an int 
     num = (int)(id - '0'); // subtract the ASCII value for 0 from your current id 
     level.ChangeTile(i, iter, num); 
     iter++; 
    } 
} 

しかし、これは1桁の整数(0〜9のみ)を使用する場合にのみ有効です。これは良いかもしれない:あなたは文字コードに文字を変換しているところ

foreach (var cell in fileRead.ReadLine().Split(' ')) 
{ 
    num = Int.Parse(cell); 
    level.ChangeTile(i, iter, num); 
    iter++; 
} 
+0

ここのコードは有望です。私はそれを試してみるとエラーになるが、私がそれを理解できれば、それはうまくいくと思う。デバッグは正しい値を示しました。ありがとう! – King

+0

@キングコードで構文エラーを修正しました。 – ChrisWue

+0

ご協力ありがとうございます!私のコードを少し変更しましたが、あなたのコードは問題を理解するための正しい軌道に乗りました! – King

2

これは、次のとおりです。

num = (int)id; 

id変数がcharあり、かつintにそれをキャストすると、あなたの文字コードを与え、ありません数値。

また、これは整数ではなく1文字を変換します。たとえば、テキストファイルに"12 34 56 "がある場合は、12,34、および56ではなく、1,2,3,4,5,6のコードを取得します。

スペースを空白に分割したい場合は、それぞれの部分文字列を解析します:

foreach (string id in str.Split(' ')) { 
    if (id.Length > 0) { 
    num = Int32.Parse(id); 
    level.ChangeTile(i, iter, num); 
    iter++; 
    } 
} 
関連する問題