0

したがって、私の方法は理論的には機能するはずですが、期待した結果が得られません。

新しい TextReader クラスを作成し、テキスト ファイルから文字 (int) を読み取り、それをリストに追加する関数があります。

テキストファイル データは次のようになります (48 x 30)。

111111111111111111111111111111111111111111111111 111111111111111111111111111111111111111111111111 111111111111100000000001111111111000000111111111 111111110000000000000000000000000000000011111111 100000000000000000000000000000000000000001111111 000000000000001111111111111111111111000001111111 100000001111111111111111111112211221000001111111 100000111111122112211221122111111111000001111111 111111111221111111111111111112211110000011111111 111112211111111111111111111111111100000111221111 122111111111111122111100000000000000001111111111 111111111111111111100000000000000000011111111111 111111111111111111000000000000000001112211111111 111111111111221110000001111110000111111111111111 111111111111111100000111112211111122111111111111 111111112211110000001122111111221111111111111111111122111111000000011111111111111111112211221111 111111110000000011111111112211111111111111111111 111111000000001111221111111111221122111100000011 111111000000011111111111000001111111110000000001 111111100000112211111100000000000000000000000001 111111110000111111100000000000000000000000000011 111111111000011100000000000000000000000011111111 111111111100000000000000111111111110001111111111 111111111110000000000011111111111111111111111111 111111111111100000111111111111111111111111111111 111111111111111111111111111111111111111111111111 111111111111111111111111111111111111111111111111 111111111111111111111111111111111111111111111111 111111111111111111111111111111111111111111111111111111000000011111111111000001111111110000000001 111111100000112211111100000000000000000000000001 111111110000111111100000000000000000000000000011 111111111000011100000000000000000000000011111111 111111111100000000000000111111111110001111111111 111111111110000000000011111111111111111111111111 111111111111100000111111111111111111111111111111 111111111111111111111111111111111111111111111111 111111111111111111111111111111111111111111111111 111111111111111111111111111111111111111111111111 111111111111111111111111111111111111111111111111111111000000011111111111000001111111110000000001 111111100000112211111100000000000000000000000001 111111110000111111100000000000000000000000000011 111111111000011100000000000000000000000011111111 111111111100000000000000111111111110001111111111 111111111110000000000011111111111111111111111111 111111111111100000111111111111111111111111111111 111111111111111111111111111111111111111111111111 111111111111111111111111111111111111111111111111 111111111111111111111111111111111111111111111111 111111111111111111111111111111111111111111111111111111111111100000111111111111111111111111111111 111111111111111111111111111111111111111111111111 111111111111111111111111111111111111111111111111 111111111111111111111111111111111111111111111111 111111111111111111111111111111111111111111111111111111111111100000111111111111111111111111111111 111111111111111111111111111111111111111111111111 111111111111111111111111111111111111111111111111 111111111111111111111111111111111111111111111111 111111111111111111111111111111111111111111111111

私の方法は次のとおりです。

private void LoadReferenceMap(string FileName)
    {
        FileName = Path.Combine(Environment.CurrentDirectory, FileName);
        List<int> ArrayMapValues = new List<int>();

            if (File.Exists(FileName))
            {
                // Create a new stream to write to the file
                using (TextReader reader = File.OpenText(FileName))
                {
                    for (int i = 0; i < 48; i++)
                    {
                        for (int j = 0; j < 30; j++)
                        {
                            int x = reader.Read();

                            if (x == -1)
                                break;

                            ArrayMapValues.Add(x);
                        }
                    }
                }

                level.SetFieldMap(ArrayMapValues);
            }
    }

戻り値:

ここに画像の説明を入力

最初の行の終わりに到達するとわかるように、Read() は 13 を返し、次の行に移動する前に 10 を返しますか?

4

3 に答える 3

2

これは、次のcharように、取得したシンボルを に変換する必要があるためです。

(char)sr.Read();

その後、別のアプローチで解析できますint。たとえば、次のようになります。

int.Parse(((char)sr.Read()).ToString());

詳細については、MSDN を参照してください

最初の行の終わりに到達するとわかるように、Read() は 13 を返し、次の行に移動する前に 10 を返しますか?

.NET の改行は次のようになります: \r\n(プロパティを\n確認してください。Environment.NewLine

于 2015-01-24T15:05:50.003 に答える
1

実際のテキスト ファイルには改行が含まれています。つまり、最初の 48 文字を読み取ると、ファイル内の次は改行になります。この場合、キャリッジ リターン (文字 13) の後にライン フィード (文字 10) が続く、標準的な Windows の改行です。

コード内でこれらの改行を何らかの方法で処理する必要があります。これを行う私の好ましい方法は、上記のSteveによって概説された方法です( を使用File.ReadAllLines)。代わりに、48 文字読み取りの各セットの最後に、13/10 文字コンボをチェックすることもできます。ただし、一部のシステムでは改行を示すためにキャリッジ リターンを使用せずにライン フィードのみを使用することに注意してください。これらのファイルのソースによっては、異なる改行を処理するために何かをコーディングする必要がある場合があります。を使用ReadAllLinesすると、使用する場合と同様に、他の何かがこの問題に対処できますreader.ReadLine()

1 ではなく 49 を返す理由も不明な場合は、文字エンコーディングについて理解する必要があります。ファイルは、読み取りプログラムによって解釈されるバイトとして保存されます。この場合、文字の値を整数として読み込んでいます (これは、.NET が文字を内部に格納する方法です)。これを文字に変換する必要があります。この場合、char (つまり(char)x) にキャストできます。これは char を返し'1'ます。Integer.Parseこれを整数として使用する場合は、テキストから整数に解析するために使用する必要があります。

于 2015-01-24T16:09:57.860 に答える