如何使用Stream Writer检查和写入不同的行部分

时间:2012-04-14 19:17:08

标签: c# asp.net forms stream

我正在尝试使用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 

基本上,这位作家习惯于从他的浏览器中编写一个玩家,并从另一个浏览器/选项卡中编写玩家二的名字。我首先要检查玩家的名字是否写在第一个字段中,如果是,我会写第二个字段中的第二个玩家。另一个字段留空以描述游戏运行时的游戏状态。

我可能有逻辑问题,请指出,如果你看到任何问题。我可以使用正则表达式来比较和验证我的玩家吗?

我需要流式读取此文件才能流式传输文件,这是正确的吗?

我使用APS.NET网站和表单运行Visual Studio '08。

感谢您的时间

1 个答案:

答案 0 :(得分:2)

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

这将导致索引越界错误,因为您要拆分空字符串(将返回一个项目),然后尝试访问该单项目列表的第二项。

另外,我可以建议而不是使用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 / finally的一种方便方法,它可以免费关闭流(你仍然需要捕获异常)。