- •Лабораторная работа №3 Файлы
- •Теоретические сведения
- •Байт-ориентированный ввод/вывод в файл
- •Открытие и закрытие файла
- •Чтение/запись байтов в файл с помощью класса FileStream
- •Ввод/вывод в символьные файлы
- •Использование класса StreamWriter
- •Использование класса StreamReader
- •Практическая часть
- •Произвольный доступ к содержимому файла
- •Перечень индивидуальных заданий для выполнения лабораторной работы № 3 Вариант 1
- •Вариант 2
- •Вариант 3
- •Вариант 4
Чтение/запись байтов в файл с помощью класса FileStream
Класс FileStream определяет два метода, которые могут считывать байты из файла: ReadByte() и Read(). Для считывания одного байта из файла используется метод ReadByte():
int ReadByte()
Каждый раз при вызове этого метода из файла считывается один байт, который возвращается в виде целочисленного значения. Если при этом встречается признак конца файла, возвращается значение -1. В случае возникновения ошибки генерируется исключение IOException.
Для считывания блока байтов используется метод Read() :
int Read(byte[] buf, int offset, int numBytes)
Метод Read() предпринимает попытку считать байты, количество которых определяется параметром numBytes, из файла в буфер but, начиная с позиции, заданной параметром offset. При этом возвращается количество успешно считанных байтов. В случае возникновения ошибки ввода/вывода генерируется исключение IOException. Возможны и другие исключения, в том числе исключение NotSupportedException, генерируемое в случае, когда операция чтения не поддерживается потоком.
Для записи байтов в файл используется метод WriteByte():
void WriteByte(byte val)
Этот метод записывает байт, указанный параметром val, в файл. Если при записи возникла ошибка, генерируется исключение IOException. Если поток вывода не открыт, генерируется исключение NotSupportedException.
Байтовый массив может быть записан в файл с помощью метода Write():
int Write(byte[] buf, int offset, int numBytes)
Метод Write() записывает в файл количество байтов, указанное параметром numBytes, из массива buf, начиная с позиции, которая задана с помощью параметра offset. При этом возвращается количество записанных байтов. Если в процессе записи происходит ошибка, генерируется исключение IOException. Если поток вывода не открыт, генерируется исключение NotSupportedException.
При выполнении вывода в файл часто данные не записываются сразу же на физическое устройство. Вместо этого вывод буферизуется операционной системой до тех пор, пока не накопится достаточно большой фрагмент данных, который сразу же записывается на диск. В результате возрастает производительность системы. Однако если требуется, чтобы данные записывались на физическое устройство независимо от степени заполнения буфера, можно воспользоваться методом Flush():
void Flush ()
Если при выполнении этой операции возникает ошибка, генерируется исключение IOException.
По завершении операции вывода файла необходимо его закрыть, воспользовавшись методом Close(). При этом гарантируется, что любые выводимые данные, находящиеся в буфере, будут записаны в файл. Поэтому не стоит вызывать метод Flush() перед закрытием файла.
Пример 2.
using System;
using System.IO;
namespace ConsoleApplication2
{
class Program
{
static void Main(string[] args)
{
int i;
FileStream fin;
FileStream fout;
// открытие исходного файла
try
{
fin = new FileStream("first.txt", FileMode.Open);
}
catch (FileNotFoundException exc)
{
Console.WriteLine(exc.Message + "\n Исходный файл не найден");
return;
}
// открытие файла-копии
try
{
fout = new FileStream("second.txt", FileMode.Create);
}
catch (FileNotFoundException exc)
{
Console.WriteLine(exc.Message + "\n Ошибка создания файла-копии");
return;
}
catch(IndexOutOfRangeException exc)
{
Console.WriteLine(exc.Message+"\nUsage file.txt");
return;
}
//Копирование файла
try
{
do
{
i=fin.ReadByte();
if(i!=-1) fout.WriteByte((byte) i);
}
while(i!=-1);
}
catch(IOException exc)
{
Console.WriteLine(exc.Message + "Файловая ошибка");
return;
}
fin.Close();
fout.Close();
}
}
}
