2013-10-08 2 views
1

C#을 사용하여 txt 파일에서 읽고 쓰려고합니다. 현재 목록에있는 이름을 읽고이를 사용자에게 보여주고 다른 이름을 묻고 목록에 추가하는 프로그램을 작성하고 있습니다. 독서는 훌륭하지만 글쓰기에 문제가 있습니다.txt 파일에서 읽기 및 쓰기

코드는 CSC를 사용하여 고급 컴파일하고 그것을 잘 실행하지만 내가 추가하고 Enter 키를 눌러 이름을 입력 한 후, 나는 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

스트림을 다시 열기 전에 닫아서 작성하십시오. 더 나은 'using'문 사용하기 –

+2

왜'File.ReadAllLines'을 사용하고, 길이를 가지고 다시 읽는가? 이것을 달성하기위한 * 더 간단한 방법이 있습니다. –

답변

-2

사용이와 당신이 닫지 않기 때문에 :

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

당신이 그 예외가 이유가 끝나면 독자를 종료하는 것을 잊지 마세요 같은 reader.ReadToEnd 기능 독자는 독서 후에. 그래서 당신은 먼저 Close()를 호출하지 않고 그것을 쓸 수 없다. 방법. 당신이 배열로 파일에서 모든 행을 읽고 싶다면

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"); 

당신은 대신 다음과 같이 닫을의 using 문을 사용할 수 있습니다

그리고 그 배열을 사용하십시오.

2

reader을 닫지 않으므로 예외가 발생합니다. 파일을 Array로 읽은 후 reader.Close();을 입력하기 만하면됩니다.

StreamReaderIDisposable 인터페이스를 사용하므로 using 문을 사용하는 것이 더 좋으므로 이는 스트림의 처리와 폐기를 보장합니다.

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(); 
    } 
} 

그냥 보조 노트 : 대신 StreamReader 거치지

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

:

당신은 당신처럼 배열을 fillup 수 있습니다, 단지 ??? Length를 얻을 File.ReadAllLines 사용할 수 있습니다. 당신이 전적으로 그 정적 메소드를 활용하여 프레임 워크에두고 있기 때문에

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를 처리하지 않을 : 우리는이 조금 단순화에 대해 어떻게

2

.

+0

왜 파일을 읽기 시작해야합니까? 나중에 문자열 배열을 무시합니다 ... –

+0

@Jon, 그냥 Console.WriteLine 어쩌면 File.ReadAllText 전체 파일 수 있습니까? –

+0

아, 콘솔에 버려두는 것을 놓쳤습니다. - 죄송합니다. 코드는 현재 마지막 반복에서 실패 할 것입니다 - 여러분은'<='보다는'<'를 원합니다. 더 나은, foreach를 사용하십시오. 더 좋게,'File.ReadLines'과 함께'foreach'를 사용하십시오 ... –

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(); 
     } 
    } 
} 

이 방법, 당신은 을 알 수 있습니다.

또한 블록에 StreamReader이 있어야합니다.