Добавить в цитаты Настройки чтения

Страница 209 из 502

<b>      // Открыть файл, заключенный в оболочку класса StreamWriter.</b>

<b>      fstr_out = new StreamWriter(&quot;test.txt&quot;);</b>

<b>      Console.WriteLine(&quot;Введите текст, а по окончании — 'стоп'.&quot;);</b>

<b>      do {</b>

<b>        Console.Write (&quot;: &quot;); </b>

<b>        str = Console.ReadLine();</b>

<b>        if(str != &quot;стоп&quot;) {</b>

<b>          str = str + &quot;rn&quot;; // добавить новую строку </b>

<b>          fstr_out.Write(str);</b>

<b>        }</b>

<b>      } while(str != &quot;стоп&quot;);</b>

<b>    } catch(IOException exc) {</b>

<b>      Console.WriteLine(&quot;Ошибка ввода-вывода:n&quot; + exc.Message);</b>

<b>    } finally {</b>

<b>      if(fstr_out != null) fstr_out.Close() ;</b>

<b>    }</b>

<b>  }</b>

<b>}</b>

Для создания символьного потока ввода достаточно заключить байтовый поток в оболочку класса StreamReader. В классе StreamReader определено несколько конструкторов. Ниже приведен наиболее часто используемый конструктор:

<b>StreamReader(Stream поток)</b>

где поток обозначает имя открытого потока. Этот конструктор генерирует исключение ArgumentNullException, если поток оказывается пустым, а также исключение ArgumentException, если поток не открыт для ввода. После своего создания объект класса StreamReader выполняет автоматическое преобразование байтов в символы. По завершении ввода из потока типа StreamReader его нужно закрыть. При этом закрывается и базовый поток.

В приведенном ниже примере создается простая сервисная программа ввода с диска и вывода на экран содержимого текстового файла test.txt. Она служит дополнением к представленной ранее сервисной программе ввода с клавиатуры и вывода на диск.

<b>// Простая сервисная программа ввода с диска и вывода на экран,</b>

<b>// демонстрирующая применение класса StreamReader.</b>

<b>using System; </b>

<b>using System.IO;</b>

<b>class DtoS {</b>

<b>  static void Main() {</b>

<b>    FileStream fin;</b>

<b>    string s;</b>

<b>    try {</b>

<b>      fin = new FileStream(&quot;test.txt&quot;, FileMode.Open);</b>

<b>    }</b>

<b>    catch(IOException exc) {</b>

<b>      Console.WriteLine(&quot;Ошибка открытия файла:&quot; + exc.Message);</b>

<b>      return;</b>

<b>    }</b>

<b>    StreamReader fstr_in = new StreamReader(fin);</b>

<b>    try {</b>

<b>      while((s = fstr_in.ReadLine()) != null) {</b>

<b>        Console.WriteLine(s);</b>

<b>      }</b>

<b>    } catch(IOException exc) {</b>

<b>      Console.WriteLine(&quot;Ошибка ввода-вывода:n&quot; + exc.Message);</b>

<b>    } finally {</b>

<b>      fstr_in.Close();</b>

<b>    }</b>

<b>  }</b>

<b>}</b>

Обратите внимание на то, как в этой программе определяется конец файла. Когда метод ReadLine() возвращает пустую ссылку, это означает, что достигнут конец файла. Такой способ вполне работоспособен, но в классе StreamReader предоставляется еще одно средство для обнаружения конца потока — EndOfStream. Это доступное для чтения свойство имеет логическое значение true, когда достигается конец потока, в противном случае — логическое значение false. Следовательно, свойство EndOfStream можно использовать для отслеживания конца файла. В качестве примера ниже представлен другой способ организации цикла while для чтения из файла.

<b>while(!fstr_in.EndOfStream) { </b>

<b>  s = fstr_in.ReadLine();</b>

<b>  Console.WriteLine(s);</b>

<b>}</b>

В данном случае код немного упрощается благодаря свойству EndOf Stream, хотя общий порядок выполнения операции ввода из файла не меняется. Иногда такое применение свойства EndOfStream позволяет несколько упростить сложную ситуацию, внося ясность и улучшая структуру кода.

Иногда файл проще открыть, используя непосредственно класс StreamReader, аналогично классу StreamWriter. Для этой цели служит следующий конструктор:

<b>StreamReader(string путь)</b>