1

Stream Writerを使用して特定の行部分に書き込もうとしています。これまでのところ、次のようになっています。

例外メッセージは私に与えています:インデックスは配列の範囲外でした。

private void WriteData(string playerName)
    {
        StreamWriter nameWriter = null;
        StringBuilder sb = new StringBuilder();

        try
        {
            string line = "";
            string namePartOne = line.Split(DELIMITER)[0];
            string namePartTwo = line.Split(DELIMITER)[1];
            if (namePartOne != EMPTY)
            {
                namePartTwo = playerName;
                string[] gameState = { namePartOne, namePartTwo, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY };
                sb.Append(gameState);
                nameWriter.WriteLine(String.Join(",", gameState));
            }
            else
            {
                nameWriter = new StreamWriter(filepath, true);
                string[] gameState = { playerName, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY };
               
                nameWriter.WriteLine(String.Join(",", gameState));
            }
        }
        catch (Exception ex)
        {
            txtTextBox2.Text = "The following problem ocurred when writing to the file:\n"
               + ex.Message;
        }
        finally
        {
            // Closing the StreamWriter should close it 
            // AND its underlying FileStream
            if (nameWriter != null)
                nameWriter.Close();
        }
    }

私はこれを私のテキストファイルに出力しようとしています:

playerOneName, playerTwoName, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY 

基本的に、このライターは、ブラウザーからプレーヤー1を書き込み、別のブラウザー/タブからプレーヤー2の名前を書き込むために使用されます。最初にプレイヤーの名前が最初のフィールドに書かれているかどうかを確認したいのですが、書かれている場合は、2番目のプレイヤーを2番目のフィールドに書き込みます。他のフィールドは、ゲーム実行時のゲーム状態を説明するために空のままになっています。

論理的な問題があるかもしれません。もしあれば指摘してください。正規表現を使用して、プレーヤーがいることを比較および検証できますか?

ファイルをストリーム書き込みする前に、このファイルをストリーム読み取りする必要がありますが、それは正しいですか?

APS.NETWebサイトとフォームを使用してVisualStudio'08を実行しています。

御時間ありがとうございます

4

1 に答える 1

2
string line = "";
string namePartOne = line.Split(DELIMITER)[0];
string namePartTwo = line.Split(DELIMITER)[1];

これにより、空の文字列(1つのアイテムを返す)を分割してから、その1つのアイテムリストの2番目のアイテムにアクセスしようとするため、インデックスが範囲外のエラーになります。

また、StringBuilderを使用するのではなく、提案することもできます。

String.Join(",", gameState);

出力文字列を作成します。

考えられる全体的な解決策は次のとおりです(コンパイラーがないため、エラーが発生した場合はお詫びします)。

List<String> gameState;
using (var reader = new StreamReader(filename))
    gameState = reader.ReadLine().Split(new[] {','});

if (gameState[0] == "")
    gameState[0] = playerName
else
    gameState[1] = playerName;

using (var writer = new StreamWriter(filename))
    writer.WriteLine(String.Join(",", gameState));

注:「using」は、無料でストリームを閉じるtry / finalを取得するための便利な方法です(ただし、例外をキャッチする必要があります)。

于 2012-04-14T19:21:34.300 に答える