
- •Лабораторная работа №3 Файлы
- •Теоретические сведения
- •Байт-ориентированный ввод/вывод в файл
- •Открытие и закрытие файла
- •Чтение/запись байтов в файл с помощью класса FileStream
- •Ввод/вывод в символьные файлы
- •Использование класса StreamWriter
- •Использование класса StreamReader
- •Произвольный доступ к содержимому файла
- •Практическая часть
- •Перечень индивидуальных заданий для выполнения лабораторной работы № 3 Вариант 1
- •Вариант 2
- •Вариант 3
- •Вариант 4
Елабужский филиал федерального государственного бюджетного образовательного учреждения высшего профессионального образования
«Казанский национальный исследовательский технический университет им. А.Н. Туполева – КАИ»
Лабораторная работа №3
по дисциплине
“Объектно-ориентированное программирование”
Файлы
Елабуга 2013
Лабораторная работа №3 Файлы
Цель: Научиться писать программы на C#, работающие с файлами.
Теоретические сведения
В C# ввод/вывод данных реализуют с помощью потоков. Под потоком понимается вывод либо получение информации. Поток связан с физическим устройством посредством системы ввода/вывода C#. Потоки используются для работы с консолью и файлами.
На самом низком уровне все операции ввода/вывода в C# оперируют байтами, потому что большинство устройств, предназначенных для выполнения операций ввода/вывода, являются байт-ориентированными. Но байтовые потоки неудобно использовать при выполнении символьного ввода/вывода. Преимущество символьных потоков проявляется в том, что они оперируют непосредственно с символами Unicode. Поэтому, если возникает потребность в хранении текста Unicode, наилучшим выбором в этом случае будут символьные потоки. Поэтому в C# используются несколько классов, преобразующих байтовые потоки в символьные и обратно.
Рассмотрим сначала байт-ориентированный ввод/вывод в файл, а затем символьный.
Байт-ориентированный ввод/вывод в файл
Для создания байтового потока, связанного с файлом, используется класс FileStream. Все классы потоков (в том числе и класс FileStream) определены в пространстве имен System.IO. Поэтому обычно в начало любой программы, применяющей классы потоков, включается конструкция:
using System.IO;
Открытие и закрытие файла
При создании байтового потока, связанного с файлом, требуется сформировать объект FileStream. Синтаксис создания следующий:
FileStream(string filename, FileMode mode);
где filename – указывает имя открываемого файла, которое может включать полностью определенный путь к нему.
mode – определяет, каким образом открывается файл. Может принимать одно из следующих значений (таблица 1).
Таблица 1
Значение |
Описание |
FileMode.Append |
Выводимые данные добавляются после данных, находящихся в файле. |
FileMode.Create |
Создается новый выходной файл. Любой ранее созданный файл с аналогичным именем уничтожается. |
FileMode.CreateNew |
Создается новый выходной файл. |
FileMode.Open |
Открывается существующий файл. |
FileMode.OpenOrCreate |
В случае наличия файла происходит его открытие, если файл не существует, он создается. |
FileMode.Truncate |
Открывается существующий файл, но его длина усекается до нуля. |
При любой работе с файлами, необходимо осуществлять проверку возможных ошибок. В C# для этого используется система обработки исключений. Исключения – это возможные ошибки, возникающие при работе программы.
При открытии файла возможны следующие исключения:
FileNotFoundException – файл не может быть открыт, поскольку он не существует;
IOException – файл не открывается из-за ошибки ввода/вывода;
ArgumentNullException – имя файла выражается нулевым значением,
ArgumentException – параметр, задающий режим открытия файла, некорректен,
SecurityException – пользователь не имеет прав доступа,
DirectoryNotFoundException – указанный каталог не существует.
Рассмотрим пример открытия файла test.txt и обработки возможных исключений:
Пример 1.
FileStream fin;
try
{
fin = new FileStream("test.txt", FileMode.Open);
}
catch (FileNotFoundException exc)
{
Console.WriteLine(exc.Message);
return;
}
catch
{
Console.WriteLine("Невозможно открыть файл");
return;
}
Первый оператор catch перехватывает ошибку, связанную с невозможностью обнаружения файла. Второй оператор catch обеспечивает перехват всех остальных исключений, связанных с выполнением файловых операций.
Конструктор FileStream открывает файл для чтения и записи. Если доступ необходимо ограничить только чтением или только записью, указывается строка следующего вида:
FileStream(string filename, FileMode mode, FileAccess how)
Параметр how задает способ доступа к файлу:
FileAccess.Read FileAccess.Write FileAccess.ReadWrite
Например, следующая строка открывает файл только для чтения:
FileStream fin = new FileStream("test.dat", FileMode.Open, FileAccess.Read);
Если работа с файлом была завершена, необходимо закрыть его, используя метод Close().
При закрытии файла происходит освобождение системных ресурсов, выделенных для файла. С этого момента они становятся доступными при обработке другого файла. Метод Сlose() может генерировать исключение IOException.