2013-03-12 13 views
0

我遇到問題。添加StreamReader代碼後,無法將變量添加到我的文本文件StreamWriter

這是代碼:

StreamReader lasa = new StreamReader("klubbar.txt"); 
while (true) 
{ 
    string line = lasa.ReadLine(); 

    if (line == null) 
    { 
     break; 
    } 
    antal++; 
    Console.WriteLine(line); 

} 
lasa.Close(); 

這行代碼給我帶來了問題,寫我的變量,以我的文本文件:

StreamWriter sparaklubb = new StreamWriter("klubbar.txt"); 

for (int i = 1; i <= antal; i++) 
{ 
    sparaklubb.Write(klubbar[i].id + "\t"); 
    sparaklubb.Write(klubbar[i].klubbnamn + "\t"); 
    sparaklubb.Write(klubbar[i].vip + "\t"); 
    sparaklubb.Write(klubbar[i].dansgolv + "\t"); 
    sparaklubb.Write(klubbar[i].intrade + "\t"); 
    sparaklubb.Write(klubbar[i].casino + "\t"); 
    sparaklubb.WriteLine(klubbar[i].genre); 
} 
sparaklubb.Close(); 

因爲我得到這個錯誤:

enter image description here

我沒有線索如何解決它,如果我remov e StreamReader代碼一切正常。

+0

請將完整的錯誤信息作爲文本發佈(不作爲圖片,這並不是谷歌的好消息)。 – 2013-03-12 10:29:27

+1

您是否檢查過'klubbar'是否包含有效的對象引用? – 2013-03-12 10:29:55

+0

你在哪裏把線條放入klubbar []?爲什麼你的klubbar []的索引從1開始,而不是從0開始? – 2013-03-12 10:31:27

回答

0

問題是您在閱讀器代碼後沒有將antal重置爲0。這會導致插入到klubbar陣列中的代碼從當前值antal開始,例如可能讀取器讀取5行,因此antal爲5.這意味着您沒有將對象放入klubbar陣列在1-4位置(你真的應該從0開始索引)。然後在您的作者代碼中,您嘗試引用nullklubbar[1]上的成員。刪除讀取器代碼會「修復」問題,因爲antal在開始將對象放入klubbar陣列時將爲0。我的建議是使用List<klubb>而不是陣列。

+0

非常感謝您的幫助,但我該如何做才能開始在我的數組中填充索引0?我剛剛在三天前在瑞典開始了我的c#課程,所以我沒有這麼高,但是我盡我所能!再次感謝! – 2013-03-12 11:47:15

0

基於快速查看代碼,您永遠不會填充數組,因爲數組中的每個實體都是空的,所以當您嘗試訪問對象上的字段時,對象本身爲空。

因此對象沒有設置異常。

您需要正確地實現從文本文件中的人口在你的StreamReader部分

 klubb[] klubbar = new klubb[100]; //Skapa en vektor där varje element kan behålla flera olika variblar från klassen "klubb" 

     //IF YOU REMOVE THIS STREAMREADERCODE WITH THE WHILE LOOP EVERYTHING WILL WORK FINE 
     StreamReader lasa = new StreamReader("klubbar.txt"); 
     while (true) 
     { 
      string line = lasa.ReadLine(); 

      if (line == null) 
      { 
       break; 
      } 
      antal++; 
      Console.WriteLine(line); 
      // klubbar[antal] = line;  //ADD EACH LINE IN TEXTFILE TO AN SEPAREATE INDEX IN ARRAY klubar 
     } 
     lasa.Close(); 

正如你在每次需要到該行解析爲您Klubb對象讀取線。這應該很簡單,因爲它看起來像你的文件是製表符分隔。

1  Harrys True 6 100 blackjack klubbfan 
2  xoY True 6 100 blackajacka klubb 
3  lounge True 6 100 blackjacka klubb 

迴應評論,所以你可以這樣做:

klubbar[antal] = GetKlubbFromString(line); 
^ this line is to replace the line in your stream reader section 

private static klubb GetKlubbFromString(string line) 
    { 
     string[] lineItems = line.Split('\t'); 

     //1  Harrys True 6 100 blackjack klubbfan 


     return new klubb 
        { 
         id = Convert.ToInt32(lineItems[0]), 
         klubbnamn = lineItems[1], 
         vip = Convert.ToBoolean(lineItems[2]), 
         dansgolv = Convert.ToInt32(lineItems[3]), 
         intrade = Convert.ToInt32(lineItems[4]), 
         casino = lineItems[5], 
         genre = lineItems[6] 
        }; 
    } 

我個人不會用Convert.To由於例外,我喜歡的TryParse,我敢肯定,一些亮SO會員會出現,並提供更好的方式來做到這一點。

+0

非常感謝您爲您提供結構化且易於理解的我只是想讓如何將每一行放入我的文本文件中,並將其放入基於變量「antal」的索引中。 – 2013-03-12 12:03:55

+0

您可以通過line.split()將'\ t'傳遞給split方法,它會返回一個字符串數組string [],然後解析出正確的類型,比如int.TryParse(line [0],out Klubb [i] .Id)不需要解析,只需直接設置對象字段 – AdamWhite 2013-03-12 12:28:41

+0

我已經在上面的答案中添加了一個示例 – AdamWhite 2013-03-12 12:36:49