Чтение и запись текста (символьные потоки)
Символьные потоки работают с любой кодировкой.
Чтобы выполнять файловые операции на символьной основе, помес- тите объект класса FileStream внутрь объекта класса StreamReader или класса StreamWriter.
Эти классы автоматически преобразуют байтовый поток в строки и наоборот.
ОСОБЕННОСТИ:
Метод StreamReader.ReadLine() автоматически определяет конец строки и прекращает чтение в этом месте.
Метод StreamWriter.Writer() автоматически добавляет комбинацию конца строки (\r\n – возврат каретки, перевод строки).
Файл
байт,байт,…
MemoryStream FileStream
Байтовый поток
StreamReader / StreamWriter
байт+байт+…+\r\n
Строка
рис.8
Присоединение файла или потока к классам StreamReader или StreamWriter
Класс StreamReader можно использовать для чтения данных из лю- бого источника. Для этого вместо применения имени файла в конструк- торе можно применять ссылку на другой поток. Например, в классе FileInfo существуют методы OpenText() и CreateText(), которые возвра- щают ссылки на StreamReader.
Класс StreamWriter можно использовать для записи данных в любой приемник.
Класс StreamReader — производный от TextReader.
Класс StreamWriter — производный от класса TextWriter.
Следовательно, классы StreamWriter и StreamReader имеют доступ к методам и свойствам, определенным их базовыми классами.
StreamReader
В классе StreamReader определено несколько конструкторов. Чаще всего используются следующие конструкторы, которые проверяют мар- керы кодировки в начале файла (2-3 символа):
StreamReader (string path) //прямое присоединение StreamReader к файлу path – полный путь (имя файла). Файл должен существовать. StreamReader (Stream stream) // присоединение StreamReader к потоку stream - имя открытого потока.
Примеры.
1) StreamReader sr = new StreamReader(@"c:\Temp\ReadMy.txt");
2) FileStrim fs = new FileStrim (@"c:\Temp\ReadMy.txt",
FileMode.Open, FileAccess.Read, FileShare.None); StreamReader sr = new StreamReader(fs);
Методы чтения:
string str = sr.ReadLine(); // читать строку, null - EOF string str2 = sr.ReadToEnd(); // прочитать весь остаток файла
int nextChar = sr.Read (); // прочитать один символ (-1 = EOStrim)
char[ ] chr = new char[100];
int n = sr.Read(chr, 0, 100); // 100 символов со смещением 0
// n – реально прочитанное кол-во
Возвращаемая строка не содержит завершающий знак возврата ка- ретки или перевода строки.
Если ссылка, возвращаемая методом ReadLine(), равна значению null,
значит, достигнут конец файла.
StreamWriter
Самые популярные конструкторы класса StreamWriter:
StreamWriter (string path) StreamWriter (Stream stream)
StreamWriter (string filename, bool appendFlag)
Если appendFlag равен значению true, выводимые данные добавляют- ся в конец существующего файла. В противном случае заданный файл перезаписывается. В последних двух случаях, если файл не существует, он создается.
Примечание. Применяется кодировка UTF8, принятая в .NET по умол- чанию. Для смены – другие конструкторы.
Методы записи:
string str;
sr.WriteLine(str); // записать строку
char chr1 = ‘a’;
sr.Write(chr1); // записать один символ
char[ ] chr = new char[100];
sr.Write (chr); // записать 100 символов
char[ ] chr = new char[100];
sr.Write (chr, 25, 50); // записать 50 символов с 25-ого
Если вы сами формируете строку из последовательности символов
(для Write), то не забудьте ее оформить как строку:
Enter
13 10
\r \n
Environment.NewLine
рис. 9
Пример чтения/записи. (Без обработки исключений.)
/* Простая утилита "клавиатура-диск"
демонстрирует использование класса StreamWriter. */
using System; using System.IO;
class KtoD
{
public static void Main()
{
string str;
FileStream fout;
fout = new FileStream ( "test.txt", FileMode.Create ); StreamWriter sout = new StreamWriter ( fout );
Console.WriteLine ("Введите текст ('стоп' для завершения)."); while (true);
{
str = Console.ReadLine();
if (str = "стоп") break;
{
str = str + "\r\n"; // Добавляем символы новой строки. sout.Write(str);
}
}
sout.Close();
}
}
Исключения:
ArgumentException |
поток stream не открыт для вво- да/вывода |
ArgumentNullException |
поток stream имеет null-значение |
FileNotFoundException |
Не удается найти файл (для path). |
DirectoryNotFoundException |
Указанный путь (path ) недопус- тим; возможно, он отсылает к неото- браженному диску. |
IOException |
Параметр path включает непра- вильный или недопустимый синтак- сис имени файла, имени папки или метки тома. |
Пример. (С обработкой исключений.)
/* Простая утилита "клавиатура-диск", которая демонстрирует использование класса StreamWriter. */
using System; using System.IO;
class KtoD
{
public static void Main()
{
string str;
FileStream fout;
try
{
fout = new FileStream("test.txt", FileMode.Create);
}
catch (IOException exc)
{
Console.WriteLine(exc.Message + " He удается открыть файл."); return;
}
StreamWriter fstr_out = new StreamWriter(fout);
Console.WriteLine("Введите текст ('стоп' для завершения)."); do
{
Console.Write(": ");
str = Console.ReadLine();
if (str != "стоп")
{
str = str + "\r\n"; // Добавляем символ новой строки.
try
{
fstr_out.Write(str);
}
catch (IOException exc)
{
Console.WriteLine(exc.Message + " Ошибка при работе с файлом."); return;
}
}
} while (str != "стоп");
fstr_out.Close();
}
}
Следующая программа создает простую утилиту "диск - клавиатура", которая считывает текстовый файл test.txt и отображает его содержимое на экране. Таким образом, эта программа представляет собой дополне- ние к утилите, представленной ранее.
Пример. (Без обработки исключений.)
// Простая утилита "диск - клавиатура" демонстрирует
// использование класса StreamReader. using System;
using System.IO;
class DtoK
{
public static void Main()
{
string s;
FileStream fin = new FileStream ("test.txt", FileMode.Open); StreamReader sin = new StreamReader(fin);
// Считываем файл построчно. while ((s = sin.ReadLine()) != null)
{
Console.WriteLine(s);
}
sin.Close();
}
}
Пример. (С обработкой исключений.)
using System; using System.IO;
class DtoS
{
public static void Main()
{
string s;
FileStream fin;
try
{
fin = new FileStream ("test.txt", FileMode.Open);
}
catch (FileNotFoundException exc)
{
Console.WriteLine(exc.Message + "He удается открыть файл."); return;
}
StreamReader fstr_in = new StreamReader(fin);
// Считываем файл построчно.
while ((s = fstr_in.ReadLine()) != null)
{
Console.WriteLine(s);
}
fstr_in.Close();
}
}
Пример открытия выходного файла классом StreamWriter. (Без обра- ботки исключений.) Новая версия предыдущей утилиты "клавиатура- диск".
// Открытие файла с использованием класса StreamWriter. using System;
using System.IO;
class KtoD
{
public static void Main()
{
string str;
// Открываем файл напрямую, используя класс StreamWriter. StreamWriter sout = new StreamWriter ( "test.txt" );
Console.WriteLine ("Введите текст ('стоп' для завершения)."); do
{
Console.Write (": ");
str = Console.ReadLine();
if (str != "стоп")
{
str = str + "\r\n"; // Добавляем символ новой строки
sout.Write(str);
}
} while (str != "стоп");
sout.Close();
}
}
Если файл не существует, то он создается. У конструктора класса
FileStreem возможностей больше.
Кодировка текстовых потоков
В C# используются следующие статические свойства класса
System.Text.Encoding для кодировки текстовых потоков
Кодировка |
Описание |
ASCII |
Кодировка ASCII без символов кириллицы, в которой для представления текстовых символов используются младшие 7 бит байта |
Unicode |
Кодировка UNICODE. Для представления символов используется 16 бит (т. е. 2 байта). Сигнатура = FF FE в нач.файла |
|
для StreamWriter |
UTF7 |
Кодировка UCS Transformation Format. Применяется для представления символов UNICODE. В ней использу- ются младшие 7 бит данных |
UTF8 |
To же, но для представления символов UNICODE в ней используется 8 бит данных |
Default |
Системная кодировка ANSI (не путайте ее с кодиров- кой ASCII). В этой кодировке для представления каждого символа используется 8 бит данных |
Свойства класса кодировки System.Text.Encoding: ASCII – 1 байт (старший бит = 0);
Default – по умолчанию (UTF8); Unicode – 2 байта;
UTF32 – 4 байта;
UTF7 – 1 байт, старший бит не используется; UTF8 – 1 байт (по умолчанию в .NET).
Материалы на данной страницы взяты из открытых источников либо размещены пользователем в соответствии с договором-офертой сайта. Вы можете сообщить о нарушении.