2012-04-14 52 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