Символьні потоки StreamWriter і StreamReader працюють з Unicode-символами. Ці потоки є спадкоємцями класів TextWriter і TextReader. У таблицях 11.6 і 11.7 приведені найбільш важливі елементи цих класів. Як бачите, довільний доступ для текстових файлів не підтримується.
  
 Таблиця 11.6
 Найбільш важливі елементи базового класу TextWriter
  
   |  Елемент
  |   Опис
  |  
  |  Close
  |   Закрити файл і звільнити пов'язані з ним ресурси. Якщо в процесі запису використовується буфер, він буде автоматично очищений
  |  
  |  Flush
  |   Очистити всі буфери для поточного файлу і записати накопичені в них дані в місце їх постійного зберігання. Сам файл при цьому не закривається
  |  
  |  NewLine
  
  
  |   Використовується для завдання послідовності символів, що означають початок нового рядка. За умовчанням використовується послідовність “повернення каретки” - “переведення рядка” ( \r \n)
  |  
  |  Write
  |   Записати фрагмент тексту в потік
  |  
  |  WriteLine
  |   Записати рядок в потік і перейти на інший рядок
  |  
 
  
 Таблиця 11.7
 Найбільш важливі елементи класу TextReader
  
   |  Елемент
  |   Опис
  |  
  |  Peek
  |   Повернути наступний символ, не змінюючи позицію покажчика у файлі
  |  
  |  Read
  |   Рахувати дані з вхідного потоку
  |  
  |  ReadBlock
  |   Рахувати з вхідного потоку вказану користувачем кількість символів і записати їх в буфер, починаючи із заданої позиції
  |  
  |  ReadLine
  |   Рахувати рядок з поточного потоку і повернути його як значення типу string. Порожній рядок (null) означає кінець файлу (EOF)
  |  
  |  ReadToEnd
  |   Рахувати всі символи до кінця потоку, починаючи з поточної позиції, і повернути дані як один рядок типу string
  |  
 
  
 Ви вже знайомі з деякими методами, приведеними в цих таблицях: впродовж всього посібника постійно використовувалися методи читання з текстових потоків і запису в текстові потоки, але не для дискових файлів, а для консолі, яка є їх окремим випадком.
 У лістингу 11.3 створюється текстовий файл, в який записуються два рядки. Другий рядок формується з перетворених чисельних значень змінних і пояснюючого тексту. Вміст файлу можна подивитися в будь-якому текстовому редакторові. Файл створюється в тому ж каталозі, куди середовище записує виконуваний файл. За умовчанням це каталог ...\ConsoleApplication1\bin\Debug.
  
 Лістинг 11.3. Виведення в текстовий файл
  
 using System;
 using System.IO;
 using System.Collections.Generic;
 using System.Linq;
 using System.Text;
  
 namespace examp76
 {
 class Program
 {
 static void Main(string[] args)
 {
 try
 {
 StreamWriter f = new StreamWriter( "text.txt" );
 f.WriteLine( "ABCDEF:" );
 double a = 12.234;
 int b = 29;
 f.WriteLine( " a = {0,6:C} b = {1,2:X}", a, b );
 Console.WriteLine(" a = {0,6:C} b = {1,2:X}", a, b);
 f.Close();
 }
 catch( Exception e )
 {
 Console.WriteLine( "Error: " + e.Message );
 return;
 }
 }
 }
 }
  
  
 У лістингу 11.4 файл, створений в попередньому прикладі, виводиться на екран.
  
 Лістинг 11.4. Читання текстового файлу
  
 using System;
 using System.IO;
 namespace exam77
 {
 class Class1
 {
 static void Main()
 {
 try
 {
 StreamReader f = new StreamReader( "1.txt" );
 string s = f.ReadToEnd();
 Console.WriteLine(s);
 f.Close();
 }
 catch( FileNotFoundException e )
 {
 Console.WriteLine( e.Message );
 Console.WriteLine( " Проверьте правильность имени файла!" );
 return;
 }
 catch( Exception e )
 {
 Console.WriteLine("Error:" + e.Message);
 return;
 }
 }
 }
 }
  
 У цій програмі весь файл прочитується за один прийом за допомогою методу ReadToEnd. Частіше виникає необхідність прочитувати файл порядково, такий приклад приведений в лістингу 11.5.
  
 Лістинг 11.5. Порядкове читання текстового файлу
 using System;
 using System.IO;
 using System.Collections.Generic;
 using System.Linq;
 using System.Text;
  
 namespace examp78
 {
 class Class1
 {
 static void Main()
 {
 try
 {
 StreamReader f = new StreamReader( "1.txt" );
 string s;
 long i = 0;
 while ( ( s = f.ReadLine() ) != null )
 Console.WriteLine( " {0} : {1} ", ++i, s );
 f.Close();
 }
 catch( FileNotFoundException e )
 {
 Console.WriteLine( e.Message );
 Console.WriteLine( " Перевірте правильність імені файлу!" );
 return;
 }
 catch ( Exception e )
 {
 Console.WriteLine( "Error: " + e.Message );
 return;
 }
 }
 }
 }
  
 Приклад перетворення чисел, що містяться в текстовому файлі, в їх внутрішню форму представлення приведений в лістингу 11.6. У програмі обчислюється сума чисел в кожному рядку.
 На вміст файлу накладаються строгі обмеження: числа мають бути розділені рівно одним пропуском, після останнього числа в рядку пропуску бути не повинно, файл не повинен закінчуватися символом переведення рядків. Методи розбиття рядка і перетворення в цілочисельне представлення розглядалися раніше.
  
 Лістинг 11.6. Перетворення рядків в числа
 using System;
 using System.IO;
 namespace examp80
 { class Class1
 { static void Main()
 {
 try
 {
 StreamReader f = new StreamReader("1.txt" );
 string s;
 const int n = 20;
 int[] a = new int[n];
 string[] buf;
 while (( s = f.ReadLine() ) != null )
 {
 buf = s.Split(' ') ;
 long sum = 0;
 for ( int i = 0; i < buf.Length; ++i )
 {
 a [i] = Convert.ToInt32( buf[i] );
 sum += a [i] ;
 }
 Console.WriteLine( "{0} сумма: {1}", s, sum );
 }
 f.Close();
 }
 catch( FileNotFoundException e )
 {
 Console.WriteLine( e.Message );
 Console.WriteLine( " Перевірте правильність імені файлу!" );
 return;
 }
 catch ( Exception e )
 {
 Console.WriteLine( "Error; " + e.Message );
 return;
 }
 }
 }
 }
  
 Результат роботи програми:
 1 2 4 сума: 7
 3 44 -3 6 сума: 50
 8 1 1 сума: 10