Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Чтение и запись текста (символьные потоки)
Символьные потоки работают с любой кодировкой. Чтобы выполнять файловые операции на символьной основе, поместите объект класса FileStream внутрь объекта класса StreamReader или класса StreamWriter. Эти классы автоматически преобразуют байтовый поток в строки и наоборот.
ОСОБЕННОСТИ:
Метод StreamReader.ReadLine() автоматически определяет конец строки и прекращает чтение в этом месте.
Метод StreamWriter.Writer() автоматически добавляет комбинацию конца строки (\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), то не забудьте ее оформить как строку:
рис. 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(); } }
Исключения:
Пример. (С обработкой исключений.)
/* Простая утилита " клавиатура-диск", которая демонстрирует использование класса 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 для кодировки текстовых потоков
Свойства класса кодировки System.Text.Encoding: ASCII – 1 байт (старший бит = 0); Default – по умолчанию (UTF8); Unicode – 2 байта; UTF32 – 4 байта; UTF7 – 1 байт, старший бит не используется; UTF8 – 1 байт (по умолчанию в.NET).
|