2012-04-14 79 views
1

我想写使用流写入特定的线部分写入不同lineparts,这里是我到目前为止有:如何检查和使用流写入

异常消息给我:指数外数组的边界。

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。

感谢您的时间

+0

这不是我昨天见过的吗?为什么不提到那个? http://stackoverflow.com/questions/10149250/how-can-i-format-my-stream-writer-to-write-to-my-text-file/10149601#comment13017225_10149601 – NSGaga 2012-04-14 19:20:09

+0

其工作正在进行中,新的错误。 – GivenPie 2012-04-14 19:32:07

回答

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

注:“使用”是一个方便的方式来获得那些试图/最终这关闭免费流(尽管如此,你仍然需要捕捉异常)。

+0

逗号将只出现在项目之间,而不是在开头或结尾 – Scroog1 2012-04-14 19:41:31

+0

你知道我怎么仍然可以用分隔符分割队列但不使用空字符串吗? – GivenPie 2012-04-14 19:46:16

+0

我不确定你指的是哪条线。如果你的意思是gameState,那已经在一个数组中了。你可以检查gameState [0] ==“”,如果这是错误的,把名字放在gameState [1]中,这是否做你想要的? – Scroog1 2012-04-14 19:50:05