Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
lab_tlpt_12_7.doc
Скачиваний:
1
Добавлен:
01.03.2025
Размер:
494.08 Кб
Скачать

Лабораторная работа № 2 Лабораторная работа № 1.2. Разбор исходного файла.

Методы статического класса System.IO.File для работы с файлами. Чтение, запись текстового файла. Класс System.IO.StreamReader для реализации потокового чтения из файла.

Классы C#, обеспечивающие работу с файловой системой, расположены в пространстве имен System.IO . Поэтому для доступа к этим классам в коде без указания пространства имен необходимо использовать директиву подключения namespace:

using System.IO;

Статический класс File предоставляет основные функции для работы с файлами, в том числе нужные нам чтение файла в строку и запись строки в файл.

Чтение файла в строку. Для выбора исходного файла в структуре файловой системы используется элемент управления OpenFileDialog. Метод ShowDialog() отобразит диалог выбора файла на экран, а о том, какую кнопку в диалоге нажал пользователь можно узнать, сравнив значение, возвращенное методом с константами статического класса DialogResult. При значении, равном DialogResult.OK путь к выбранному файлу в файловой системе можно получить через свойство FileName экземпляра OpenFileDialog. Это значение нужно передать в метод ReadAllText класса File. Метод вернет нам содержимое исходного файла.

Запись строки в файл. Необходимо использовать метод WriteAllText класса File. В качестве параметров ему передаются имя файла и исходная строка. Широко распространенной практикой является проверка на существование файла перед записью с помощью метода Exists класса File.

Посимвольное чтение из файла. Класс StreamReader предоставляет методы чтения следующего символа, строки или блока в файле. Однако на каждом шаге необходимо сохранять данные о текущей строке, текущем символе и позиции символа в строке. Довольно логичным будет реализовать статический класс-обертку над StreamReader, который обеспечил бы нам не только чтение из файла,но и хранение этих данных. Реализуем этот функционал в классе Reader, созданном в ходе первой лабораторной работы (файл Reader.cs) Ниже приведен псевдокод данного класса.

Reader

{

номерСтроки;

позицияСимволаВСтроке;

текущийСимвол;

StreamReader streamReader;

читатьСледующийСимвол()

{

текущийСимвол = streamReader.Read();

если( текущийСимвол == -1 )

текущийСимвол = конецФайла;

иначе если( текущийСимвол == переводСтроки )

{

номерСтроки++;

позицияСимволаВСтроке = 0;

}

иначе если( текущийСимвол == возвратКаретки или текущийСивол == табуляция )

читатьследующийСивол();

иначе

позицияСимволаВСтроке++;

}

инициализировать( путьКФайлу )

{

если файлСуществует( путьКФайлу )

{

streamReader = новый StreamReader( путьКФайлу );

номерСтроки = 1;

позицияСимволаВСтроке = 0;

читатьСледующийСимвол();

}

}

закрыть()

{

streamReader.close();

}

}

Протестировать работу класса Reader в коде формы можно, например, так:

Reader. инициализировать( путьКФайлу );

Пока ( Reader.текущийСимвол != конецФайла )

{

вывести Reader.номерСтроки;

вывести Reader. позицияСимволаВСтроке;

вывести Reader. текущийСимвол;

Reader. читатьСледующийСимвол();

}

Замечания по коду:

  1. Все поля и методы должны быть объявлены как static;

  2. В соответствии с принципами ООП все поля должны быть закрытыми (это замечание касается всех лабораторных работ). Для чтения полей необходимо реализовать методы-свойства. Ни одно из полей НЕ должно записываться вне класса.

  3. Необходимо предусмотреть проблемные ситуации: указан некорректный путь к файлу, многократная инициализация класса (в этом случае необходимо закрывать streamReader перед его пересозданием).

Примеры кода:

Чтение файла в строку.

if(openFileDialog1.ShowDialog() == DialogResult.OK)

{

codeFile = openFileDialog1.FileName.ToString();

string code = System.IO.File.ReadAllText(codeFile);

}

Запись строки в файл.

if(File.Exists(codeFile))

{

File.WriteAllText(codeFile, code);

}

Посимвольное чтение из файла.

Файл Reader.cs в проекте.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]