Потоки символов
Выбери формат для чтения
Загружаем конспект в формате docx
Это займет всего пару минут! А пока ты можешь прочитать работу в формате Word 👇
Потоки символов
Символьные потоки StreamWriter и StreamReader предназначены для работы с текстовыми файлами, содержащими Unicode-символы. Существует возможность изменить используемую кодировку с помощью объекта System.Text.Encoding. Эти потоки являются наследниками классов TextWriter и TextReader соответственно, которые обеспечивают их большей частью функциональности. Текстовые файлы наиболее удобны для восприятия человеком, поэтому их удобно использовать для представления данных. В табл. 1 и 2 приведены наиболее важные элементы этих классов. Как видите, произвольный доступ для текстовых файлов не поддерживается.
Таблица 1. Наиболее важные элементы базового класса TextWriter
Элемент
Описание
Close
Закрыть файл и освободить связанные с ним ресурсы. Если в процессе записи используется буфер, он будет автоматически очищен.
Flush
Очистить все буферы для текущего файла и записать накопленные в них данные в место их постоянного хранения. Сам файл при этом не закрывается.
NewLine
Используется для задания последовательности символов, означающих начало новой строки. По умолчанию используется последовательность «возврат каретки» — «перевод строки» (\r\n).
Write
Записать фрагмент текста в поток.
WriteLine
Записать строку в поток и перейти на другую строку.
Таблица 2. Наиболее важные элементы класса TextReader
Элемент
Описание
Реек
Возвратить следующий символ, не изменяя позицию указателя в файле.
Read
Считать данные из входного потока.
ReadBlock
Считать из входного потока указанное пользователем количество символов и записать их в буфер, начиная с заданной позиции.
ReadLine
Считать строку из текущего потока и возвратить ее как значение типа string. Пустая строка (null) означает конец файла (EOF).
ReadToEnd
Считать все символы до конца потока, начиная с текущей позиции, и возвратить считанные данные как одну строку типа string.
Вы уже знакомы с некоторыми методами, приведенными в этих таблицах: мы постоянно использовались методы чтения из текстовых потоков и записи в текстовые потоки, но не для дисковых файлов, а для консоли, которая является их частным случаем.
Листинг 1. Вывод в текстовый файл
using System;
using System.IO; // 1
namespace Example_4
{
class Program
{
static void Main(string[] args)
{
StreamWriter f = new StreamWriter( "output.txt" ); // 2
int i = 3;
double у = 18.12;
decimal d = 600m;
string s = "Текстовый файл";
f.WriteLine( "i = " + i ); // 3
f.WriteLine( "y = {0} d = {1}", у, d ); // 4
f.WriteLine( "s = " + s ); // 5
f.Close(); // 6
}
}
}
В результате работы программы создаётся текстовый файл со следующим содержимым:
В листинге 2 создается текстовый файл, в который записываются две строки.
Вторая строка формируется из преобразованных численных значений переменных и поясняющего текста. Содержимое файла можно посмотреть в любом текстовом редакторе. Файл создается в том же каталоге, куда среда записывает исполняемый файл. По умолчанию это каталог ...\Example_1\bin\Debug.
Листинг 2. Вывод в текстовый файл
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
namespace
{
class Program
{
static void Main(string[] args)
{
try
{
StreamWriter f = new StreamWriter( "text.txt" );
f.WriteLine( "Вывод в текстовый файл:" );
double a = 12.234;
int b = 29;
f.WriteLine( " a = {0,6:C} b = {1,2:X}", a, b );
f.Close();
}
catch( Exception e )
{
Console.WriteLine( "Error: " + e.Message );
return;
}
}
}
}
В листинге 3 файл, созданный в предыдущем листинге, выводится на экран.
Листинг 3. Чтение текстового файла
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
namespace Example_2
{
class Program
{
static void Main(string[] args)
{
try
{
StreamReader f = new StreamReader( "text.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. Чаще возникает необходимость считывать файл построчно, такой пример приведен в листинге 4. Каждая строка при выводе предваряется номером.
Листинг 4. Построчное чтение текстового файла
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
namespace Example_3
{
class Program
{
static void Main(string[] args)
{
try
{
StreamReader f = new StreamReader("TextFile1.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;
}
}
}
}
Для текстового файла TextFile1.txt, содержащего фрагмент программы:
StreamReader f = new StreamReader("TextFile1.txt");
string s;
long i = 0;
while ((s = f.ReadLine()) != null)
Console.WriteLine("{0}: {1}", ++i, s);
f.Close();
Результат работы программы будет:
}
Пример преобразования чисел, содержащихся в текстовом файле, в их внутреннюю форму представления приведен в листинге 5. В программе вычисляется сумма чисел в каждой строке.
На содержимое файла накладываются весьма строгие ограничения: числа должны быть разделены ровно одним пробелом, после последнего числа в строке пробела быть не должно, файл не должен заканчиваться символом перевода строки.
Методы разбиения строки и преобразования в целочисленное представление рассматривались ранее.
Листинг 5. Преобразования строк в числа
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
namespace Example_4
{
class Program
{
static void Main(string[] args)
{
try
{
StreamReader f = new StreamReader( "numbers.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;
}
}
}
}
Для текстового файла numbers.txt, содержащего целые числа:
3 4 12
34 56
8 11 35 78
Результат работы программы:
В следующем примере из текстового файла TextFile1.txt, содержимое которого представлено на рисунке ниже, считываются данные и помещаются в список List list.
Листинг 5. Преобразования строк в значения типа int.
using System;
using System.Collections.Generic;
using System.IO;
namespace Example_5
{
class Program
{
static void Main(string[] args)
{
try
{
StreamReader f = new StreamReader("TextFile1.txt");
List list = new List();
string s;
while ((s = f.ReadLine()) != null)
{
list.Add(int.Parse(s));
}
foreach (int x in list) Console.Write(x + ",");
Console.WriteLine();
f.Close();
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
}
}
Результат работы программы:
В следующем примере из текстового файла TextFile1.txt, содержимое которого представлено на рисунке ниже, считываются данные и помещаются в список List list.
Листинг 6. Преобразования строк в значения типа int.
using System;
using System.Collections.Generic;
using System.IO;
namespace Examle_6
{
class Program
{
static void Main(string[] args)
{
try
{
StreamReader f = new StreamReader("TextFile2.txt");
List list = new List();
string s = f.ReadToEnd();
string[] buf = s.Split(' ');
for (int i = 0; i < buf.Length; i++ )
{
list.Add(int.Parse(buf[i]));
}
foreach (int x in list) Console.Write(x + ",");
Console.WriteLine();
f.Close();
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
}
}
Результат работы программы:
Листинг 6. Заполнение списка случайными значения типа int.
using System;
using System.Collections.Generic;
namespace Example_7
{
class Program
{
static void Main(string[] args)
{
List list = new List();
Random rnd = new Random();
for (int i = 0; i < 10; i++)
{
list.Add(rnd.Next(10));
}
foreach (int x in list) Console.Write(x + ", ");
Console.WriteLine();
}
}
}
Результат работы программы:
Листинг 7. Заполнение файла в заданной папке случайными значения типа int.
using System;
using System.Collections.Generic;
using System.IO;
namespace Example_8
{
class Program
{
static void Main(string[] args)
{
try
{
string path = "C:\\Temp\\TextFile1.txt";
StreamWriter f = new StreamWriter(path);
Random rnd = new Random();
int n;
for (int i = 0; i < 10; i++)
{
n = rnd.Next(100);
f.WriteLine(n);
Console.Write(n + ",");
}
Console.WriteLine();
f.Close();
string path1 = @"C:\Temp\TextFile1.txt";
StreamReader g = new StreamReader(@path1);
List list = new List();
string s;
while ((s = g.ReadLine())!= null)
{
list.Add(int.Parse(s));
}
list.Sort();
foreach (int x in list) Console.Write(x + ",");
Console.WriteLine();
g.Close();
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
}
}
Результат работы программы: