2013-08-06 3 views
4

나는 컴퓨터 과정을 위해 콘솔 응용 프로그램을 작성해야합니다. 이 프로그램은 StreamReader를 사용하여 파일에서 텍스트를 읽고 문자열을 단일 단어로 분할하여 문자열 배열에 저장 한 다음 그 단어를 역방향으로 인쇄합니다.StreamReader가 캐리지 리턴으로 읽지 않습니다.

파일에 캐리지 리턴이있을 때마다 파일에서 텍스트의 읽기가 중지됩니다. 누구든지 이걸 도와 줄 수 있니? 파일 "input.txt를"

using System; 
using System.IO; 
using System.Text.RegularExpressions; 

namespace Assignment2 
{ 
    class Program 
    { 
     public String[] chop(String input) 
     { 
      input = Regex.Replace(input, @"\s+", " "); 
      input = input.Trim(); 

      char[] stringSeparators = {' ', '\n', '\r'}; 
      String[] words = input.Split(stringSeparators); 

      return words; 
     } 

     static void Main(string[] args) 
     { 
      Program p = new Program(); 

      StreamReader sr = new StreamReader("input.txt"); 
      String line = sr.ReadLine(); 

      String[] splitWords = p.chop(line); 

      for (int i = 1; i <= splitWords.Length; i++) 
      { 
       Console.WriteLine(splitWords[splitWords.Length - i]); 
      } 

      Console.ReadLine(); 

     } 
    } 
} 

그리고 여기에 있습니다 : : 여기

는 메인 프로그램입니다

This is the file you can use to 
provide input to your program and later on open it inside your program to process the input. 
+2

Ehm ...'sr.ReadLine()'maybe? –

+2

'null'을 반환하여 EOF를 나타낼 때까지 각 행을 차례로 처리하려면 루프에서'ReadLine()'을 호출해야합니다. –

답변

3

StreamReader.ReadLine 대신 StreamReader.ReadToEnd을 사용할 수 있습니다.

// Cange this: 
// StreamReader sr = new StreamReader("input.txt"); 
// String line = sr.ReadLine(); 

string line; 
using (StreamReader sr = new StreamReader("input.txt")) 
{ 
    line = sr.ReadToEnd(); 
} 

반드시 입력 파일뿐만 아니라, 제대로 닫혀을 만들 것입니다 using 블록의 추가.

또 다른 alterantive은 사용하는 것입니다 :

string line = File.ReadAllText("input.txt"); // Read the text in one line 

ReadLine 파일에서 한 줄을 읽고, 후행 carraige 리턴 및 줄 바꿈 문자를 제거합니다.

ReadToEnd은 전체 파일을 단일 문자열로 읽고 해당 문자를 보존하므로 chop 메서드가 쓰여진대로 작동 할 수 있습니다.

+0

감사합니다. 귀하의 솔루션은 전혀 번거 로움없이 완벽하게 작동했습니다. : D –

+0

[File.ReadAllText()'] (http://msdn.microsoft.com/en-us/library/ms143368.aspx)를 사용하는 것이 더 쉽다고 생각합니다. 'var line = File.ReadAllText ("input.txt");' –

+0

@MatthewWatson 그게 내 대답에 너무 ... –

2

문제는 정확히 그 작업을 수행하는 ReadLine()을 호출하고 있다는 것입니다, 그것을 캐리지 리턴을 만날 때까지 읽습니다 (루프로 호출해야 함).

일반적으로 StreamReader으로 파일을 한 줄씩 읽으려는 경우 구현은 다음과 비슷합니다 (msdn에서).

 using (StreamReader sr = new StreamReader("TestFile.txt")) 
     { 
      string line; 
      // Read and display lines from the file until the end of 
      // the file is reached. 
      while ((line = sr.ReadLine()) != null) 
      { 
       Console.WriteLine(line); 
      } 
     } 

while 루프의 조건을 읽을 수있는 것도이없는 경우 ReadLinenull를 반환하기 때문에 사용자가 파일의 끝 때까지 읽을 것을 보장한다.

또 다른 옵션은 문자열 배열을 반환하는 File.ReadAllLines(MyPath)을 사용하는 것입니다. 각 요소는 파일의 한 줄입니다. 더 완전한 예를 들자면;

string[] lines = File.ReadAllLines(MyFilePath); 
    foreach(string line in lines) 
    { 
     string[] words = line.Split(' ').Reverse(); 
     Console.WriteLine(String.Join(" ", words)); 
    } 

이러한 세 줄의 코드는 다음을 수행합니다. 전체 파일을 각 요소가 한 줄인 문자열 배열로 읽습니다. 해당 배열을 반복합니다. 각 행에서 단어를 분할하고 순서를 반대로합니다. 그런 다음 모든 단어를 다시 공백으로 결합하여 콘솔에 인쇄합니다. 전체 파일을 역순으로 원한다면 첫 줄 대신 마지막 줄에서 시작해야합니다. 그 내용은 여러분에게 맡깁니다.

3

방금 ​​한 줄로 읽었습니다. 파일 끝까지 모든 줄을 읽어야합니다. 다음이 작동해야합니다.

String line = String.Empty; 
    using (StreamReader sr = new StreamReader("input.txt")) 
    { 
     while (!sr.EndOfStream) 
     { 
      line += sr.ReadLine(); 
     } 
    } 
+0

'프로그램'이란 무엇이며'쵸핑 (chop) '은 어디에 정의되어 있습니까? 만약 프로그램이 메인을 포함하는 클래스가 인스턴스를 생성하는 것은 꽤 이상합니다 ... 저는 여러분이'System.String.Split (char delim)'을 줄에 사용해야한다고 생각합니다 ... – evanmcdonnal

+0

도움을 주셔서 대단히 감사합니다. 당신이 한 방식은 완벽하게 작동했지만 적은 코드를 사용하는 방법을 사용해야한다고 들었습니다. 하지만 답장을 보내 주셔서 대단히 감사합니다. –

+0

@evanmcdonald 완전히 동의했습니다 .. 나는 모든 줄을 읽는 문제를 해결하고있었습니다. 나머지는 방금 작업이 수행 한 내용을 복사했을 때주의를 기울이지 않았습니다. 이러한 변경은 OP에게 제안되어야합니다. 나는 OP를 오도하지 않기 위해 내가 언급하고 싶은 관련 부분을 보여주기 위해 나의 대답을 편집 할 것이다. – Gloria

관련 문제