Символьні потоки 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