150 likes | 317 Views
Лекция. Текстовые файлы. Что такое текстовый файл. Текстовый файл состоит из символов, среди которых встречаются "разделители строк". В разных ОС разделители выглядят по-разному, в Windows это r n, в Linux - <br>, в MacOS - .
E N D
Лекция Текстовые файлы
Что такое текстовый файл Текстовый файл состоит из символов, среди которых встречаются "разделители строк". В разных ОС разделители выглядят по-разному, в Windows это \r\n, в Linux - \n, в MacOS - \r. Текстовый файл можно читать или писать только последовательно. При записи и чтении текстового файла нужно учитывать кодировку символов.
Порядок работы с ресурсами Работа всегда складывается из трех этапов: Захватить ресурс. Воспользоваться ресурсом. Освободить ресурс. В применении к файлам это выглядит так. Открыть файл. Читать или писать в него. Закрыть файл.
Классы для работы с текстовыми файлами TextReader TextWriter StreamReader StreamWriter StringReader StringWriter
Абстрактный класс TextReader public virtual string ReadLine(); public virtual string ReadToEnd(); public virtual void Close(); public virtual int Read(ref char[] buffer, int index, int count); public virtual intRead(); public virtual intPeek();
Потомки TextReader'a Класс TextReaderабстрактный, поэтому для работы с файлами надиске понадобится его потомок – класс StreamReader. Открытие файла (захват ресурса)происходит в конструкторе класса StreamReader. Закрытие файла (высвобождение ресурса) выполняется виртуальным методом Close().
Пример построчного чтения publicstaticvoid Main() { TextReadersr = newStreamReader("111.txt"); string line; while ((line = sr.ReadLine()) != null) { Console.WriteLine(line); } sr.Close(); } Здесь закрытие не гарантировано, т.к. в процессе работы возможны исключения.
Инструкция using TextReadersr = newStreamReader("111.txt"); using (sr) { String line; while ((line = sr.ReadLine()) != null) { Console.WriteLine(line); } }// здесь гарантированно выполняется sr.Close() Объект можно создать прямо в заголовке using. using (TextReadersr = newStreamReader("111.txt")) { }
Абстрактный класс TextWriter public virtual void Write(тип value); public virtual void Write (string format, params Object[] arg ); public virtual void WriteLine(тип value); public virtual void Flush(); public virtual void Close(); stringfileName = "111.txt"; using (StreamWritersw = newStreamWriter(fileName, false, Encoding.GetEncoding(1251))) { for (int i = 1; i < 10; i++) { string s = newstring('Ш', i); sw.WriteLine(s); } }
Потомки TextWriter'a StreamWriter StringWriter
Пример записи Дан массив строк. Сохранить его в текстовом файле. string[] ss = { "aaaaa", "bbbbbb", "ccccccc" }; using (TextWritertw = newStreamWriter("111.txt")) { foreach (string s inss) tw.WriteLine(s); }
Кодировка символов В конечном счете в файл попадают не символы, а байты. Способ перевода потока символов в поток байтов и обратно определяется кодировкой. Кодировку осуществляет объект Encoder, который передается в объект StreamWriter. string[] ss = { "привет", "медвед", "!!!!!" }; using (TextWritertw = newStreamWriter("111.txt", false, Encoding.GetEncoding("Windows-1251"))) { foreach (string s inss) tw.WriteLine(s); }
Класс Console В классе Console есть свойства publicstaticTextReader In { get; } publicstaticTextWriter Out { get; } и методы publicstaticvoidSetIn(TextReadernewIn); publicstaticvoidSetOut(TextWriternewOut); С их помощью можно заменить клавиатуру и экран файлами. using (TextWriter writer = newStreamWriter("console.txt")) { Console.SetOut(writer); Console.Write("Вводите >"); string s = Console.ReadLine(); Console.WriteLine("Вы ввели " + s); }
Кодировка консоли TextReadersr = newStreamReader("111.txt", Encoding.GetEncoding("Windows-1251")); // Шрифт в консоли - TrueType Console.OutputEncoding = Encoding.Unicode; using (sr) { String line; while ((line = sr.ReadLine()) != null) { Console.WriteLine(line); } }
Самостоятельно Создать форму для редактирования простого текста со стандартным набором пунктов меню File: New, Open, Save, SaveAs, Exit и стандартными диалогами.Пользователь должен получать предупреждения, когда он может потерять несохраненный результат редактирования текста. Разработайте класс ArrayReader, который наследует класс TextReader и позволяет читать текст из массива символов подобно тому, как экземпляр класса StringReader позволяет читать текст из строки. Имеется два текстовых файла, строки которых упорядочены по длине. Слить их в третий, тоже упорядоченный по длине строк. Разработайте класс ArrayWriter, который наследует класс TextWriter и позволяет писать текст в массив символов.