2011-12-24 67 views
1

我有這個代碼爲c#讀取TestFile.txt中的所有行,但是當我讀完我想再次讀它,然後把它放在一個字符串數組(不是列表),但是當我嘗試再次這樣說,該文件已被使用。我想重置流或執行類似sr.Close()的操作,因爲第一次讀取它時,我想要統計Testfile.txt中有多少行。在C中的流問題#

using (StreamReader sr = new StreamReader("TestFile.txt")) 
{ 
      string line; 
      while ((line = sr.ReadLine()) != null) 
      { 
        Console.WriteLine(line); 
      } 
} 

我已經試過把while循環後if(line == null)sr.Close(),但它不起作用。

+1

爲什麼環文件中的行超過兩次? – Oded 2011-12-24 10:18:56

+0

,因爲我想找出有多少行,然後做一個字符串[] lines = new string [counter] – user1074030 2011-12-24 10:20:55

+1

爲什麼你不能使用'List '?它可以很容易地變成一個數組。 – Oded 2011-12-24 10:22:39

回答

9

爲什麼不把它讀入List<string>,然後從那裏建立一個數組?或者更簡單了,就打電話File.ReadAllLines

string[] lines = File.ReadAllLines("TestFile.txt"); 

雖然你可以重置底層流,並刷新在讀者的緩衝,我不會這麼做 - 我只是在讀它全部一次這種方式不需要您事先知道尺寸。

(事實上,我會嘗試使用的List<string>而不是string[]反正 - 他們通常會更愉快的使用閱讀Eric Lippert's blog post on the subject以獲取更多信息。)

+1

我完全同意這一點。我在Jon打敗我之前打了一些非常相似的東西(該死的社區很快)。 – Codingo 2011-12-24 10:23:02

+1

你將在早上起牀,擊敗喬恩以獲勝:http://meta.stackexchange.com/questions/9134/jon-skeet-facts – 2011-12-24 10:31:20

4

您可以通過BaseStreamPosition屬性設置爲0

做,如果你不能(例如將是一個HttpWebResponse流),那麼一個不錯的選擇將是流複製到MemoryStream ...有你可以將Position設置爲0並儘可能多地重新啓動Stream。

Stream s = new MemoryStream(); 
StreamReader sr = new StreamReader(s); 
// later... after we read stuff 
s.Position = 0;