2013-10-08 356 views
1

我正在嘗試從使用C#的txt文件讀取和寫入。目前,我正在編寫一個程序,該程序讀取列表中的名稱,向用戶顯示它們,請求另一個名稱,然後將該名稱添加到列表中。閱讀很好,但寫作存在一些問題。從txt文件讀取和寫入

代碼編譯罰款使用CSC,它執行罰款,但之後我鍵入名稱添加並按下回車鍵,我得到一個窗口彈出稱

FileIO.exe遇到問題和需要關閉。

任何想法是什麼問題是?

using System; 
using System.IO; 

public class Hello1 
{ 
    public static void Main() 
    { 
     int lines = File.ReadAllLines("Name.txt").Length; 
     string[] stringArray = new string[lines + 1]; 
     StreamReader reader = new StreamReader("Name.txt"); 
     for(int i = 1;i <=lines;i++){ 
      stringArray[i-1] = reader.ReadLine(); 
     } 
     for (int i = 1;i <=stringArray.Length;i++){ 
      Console.WriteLine(stringArray[i-1]); 
     } 
     Console.WriteLine("Please enter a name to add to the list."); 
     stringArray[lines] = Console.ReadLine(); 
     using (System.IO.StreamWriter writer = new System.IO.StreamWriter("Name.txt", true)){ 
      writer.WriteLine(stringArray[lines]); 
     } 
    } 
} 
+1

也使用'using'語句給讀者。 '使用(var reader = new StreamReader(「Name.txt」)){...}' –

+0

在你重新打開它之前關閉流。更好地使用「使用」語句 –

+2

爲什麼你使用'File.ReadAllLines',然後*只是*取長度,然後再讀一遍?有很多簡單的方法來實現這個... –

回答

-2

使用reader.ReadToEnd功能這樣的,不要忘記關閉的讀者,當你完成:

StreamReader reader = new StreamReader("Name.txt"); 
string content = reader.ReadToEnd(); 
reader.Close(); 

你會得到異常的原因是因爲你不關閉讀者閱讀後。所以你不能先寫入Close();方法。

您還可以使用using語句,而不是關閉它是這樣的:

using (StreamReader reader = new StreamReader("Name.txt")){ 
    string content = reader.ReadToEnd(); 
}; 
+0

你應該使用'using'語句 - 我想你已經錯過了問題的要點,即逐行讀取文件。 –

+0

不關閉閱讀器不會導致異常,只是泄漏資源。 – Servy

+0

謝謝喬恩,還補充說! Servy當它仍然開放時試圖寫信給它。 – Dimo

0

如果你想從文件中讀取所有行到一個數組,你可以簡單地使用:

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

並使用該數組。

2

由於您沒有關閉您的reader,您只能在將文件讀取到Array後將其放置reader.Close();

更好的是使用using聲明,因爲StreamReader使用IDisposable接口,這將確保關閉流以及處理它。

string[] stringArray = new string[lines + 1]; 
using (StreamReader reader = new StreamReader("Name.txt")) 
{ 
    for (int i = 1; i <= lines; i++) 
    { 
     stringArray[i - 1] = reader.ReadLine(); 
    } 
} 

只是側面說明

你使用File.ReadAllLines只是爲了獲得Length ???,你可以fillup喜歡你的數組:

string[] stringArray = File.ReadAllLines("Name.txt"); 

,而不是通過StreamReader去。

2

怎麼樣,我們簡化了這個有點:

foreach (var line in File.ReadLines("Name.txt")) 
{ 
    Console.WriteLine(line); 
} 
Console.WriteLine("Please enter a name to add to the list."); 
var name = Console.ReadLine(); 
File.AppendLine("Name.txt", name): 

現在你不與IO處理可言,因爲你通過利用這些靜態方法完全把它留給框架。

+0

爲什麼要讀這個文件開始?你以後忽略字符串數組... –

+0

@Jon,你可以用Console.WriteLine整個文件,也許File.ReadAllText? –

+0

啊,我錯過了它是傾倒在控制檯 - 對不起。請注意,您的代碼目前在最後一次迭代時會失敗 - 您需要使用<<而不是<= <。更好,使用'foreach'。更好的是,使用'foreach'與'File.ReadLines' ... –

1

這是很好的,以確保您在一個控制檯應用程序的頂層學習任何異常:

public class Hello1 
{ 
    public static void Main() 
    { 
     try 
     { 
      // whatever 
     } 
     catch (Exception ex) 
     { 
      Console.WriteLine("Exception!); 
      Console.WriteLine(ex.ToString()); 
     } 
     finally 
     { 
      Console.Write("Press ENTER to exit: "); 
      Console.ReadLine(); 
     } 
    } 
} 

這樣一來,你就知道爲什麼應用不得不關閉。

此外,你需要有你的StreamReaderusing塊。