2011-10-20 99 views
3

我有兩個功能:C#讀取文件

public void SaveMap() 
    { 
     StreamWriter stream = new StreamWriter("file.txt"); 
     for (int j = 0; j < GameConstants.MapMaxTilesX; j++) 
     { 
      for (int i = 0; i < GameConstants.MapMaxTilesY; i++) 
      { 
       stream.Write(map[j,i]); 
      } 
     } 
     stream.Close(); 
    } 

    public void LoadMap() 
    { 
     StreamReader stream = new StreamReader("file.txt"); 
     for (int j = 0; j < GameConstants.MapMaxTilesX; j++) 
     { 
      for (int i = 0; i < GameConstants.MapMaxTilesY; i++) 
      { 
       map[j, i] = (int)stream.Read(); 
      } 
     } 
     stream.Close(); 
    } 

而且因爲它正確地保存數據,它不讀取它。正在讀取隨機值(至少不是那些在文件中的)

我錯了什麼?

+1

map [,]中包含的是什麼類型?如果你存儲字符數組,那麼你寫的代碼不會返回字符,而是返回ASCII碼。 – Ucodia

+0

映射數組是int類型 – Neomex

+0

我重現了這個問題,並且Stream.Read()返回之前編寫的字符的ASCII碼,所以您必須將其轉換回char並將其解析爲Int32。 – Ucodia

回答

4

即使StreamReader.Read()方法返回int,它也不會從該文件讀取int。相反,它會返回單個字符。類型爲int的原因是,它可以用-1標記文件結束條件。這是從舊C風格的做事中解脫出來的。

如果您想讀取文件中的字符,可以撥打Read()並針對-1測試返回值。如果返回的值不是-1,則將其轉換爲char。那麼你將負責以有意義的方式將角色放在一起。但是有更簡單的方法來完成你正在努力完成的任務!

要做你想做的事情,你必須以某種方式分隔你的整數值,然後解析文件中的字符串,或者改用BinaryWriter/BinaryReader。

或許要做到這一點最簡單的方法就是把每行一個值是這樣的:

... 
stream.WriteLine(map[j,i]); 
... 
map[j, i] = int.Parse(stream.ReadLine()); 

如果你希望儘量減少文件的大小,那麼我建議每個寫詮釋了BinaryWriter,然後閱讀使用BinaryReader.ReadInt32()方法的值。如果你這樣做,那麼該文件將完全是4 * GameConstants.MapMaxTilesX * GameConstants.MapMaxTilesY字節長。

另一種有趣的方法是將自己的地圖上的每一行都寫在自己的行上,然後用製表符分隔每列一列'\t'。然後,您可以一次讀取一行中的值,並使用string.Split來分隔每行上的值。這種方法的優點是您可以在電子表格程序或文本編輯器中編輯文件。

+1

如果你所存儲的都是整數,我一定會通過StreamReader去使用BinaryReader/BinaryWriter。 –

+0

我同意,因爲它看起來就像是Int32。 – Ucodia

1

Stream.Read()返回當前字符的ASCII碼時,首先需要將其轉換爲常規字符,然後將其解析爲int。因此,而不是這樣做的:

map[j, i] = (int)stream.Read(); 

你需要做的:

char c = (char)stream.Read(); 
map[j, i] = Int32.Parse(c.ToString()); 

這應該做的伎倆。

+0

'StreamReader.Read()'實際上會返回讀取字符的Unicode代碼點值。如果讀取純ASCII文件,它只會返回ASCII值,而這僅僅是因爲ASCII是Unicode的一個子集。此方法的文檔並不清楚,並且一個示例實際上使用了錯誤的ASCII術語。但它肯定是返回的Unicode代碼點。例如,讀取一個CP-1252文件時,如果字符151遇到由閱讀'返回的值()'將8212(0x2014),因爲這是對應的Unicode代碼點(U + 2014 EM DASH)。 –

+0

感謝您的信息;) – Ucodia

+1

沒問題。我知道你會喜歡的! :P –