
- •Лабораторная работа №3 Файлы
- •Теоретические сведения
- •Байт-ориентированный ввод/вывод в файл
- •Открытие и закрытие файла
- •Чтение/запись байтов в файл с помощью класса FileStream
- •Ввод/вывод в символьные файлы
- •Использование класса StreamWriter
- •Использование класса StreamReader
- •Произвольный доступ к содержимому файла
- •Практическая часть
- •Перечень индивидуальных заданий для выполнения лабораторной работы № 3 Вариант 1
- •Вариант 2
- •Вариант 3
- •Вариант 4
Ввод/вывод в символьные файлы
Для автоматического преобразования байтовых потоков в символьные и наоборот используются классы StreamReader и StreamWriter. При выполнении файловых операций, основанных на использовании символов, класс FileStream включается в состав класса StreamReader или StreamWriter.
Использование класса StreamWriter
Для создания символьного потока вывода объект FileStream включается в состав класса StreamWriter следующим образом:
StreamWriter(Stream stream)
Параметр stream указывает имя открытого потока. Если указанный поток будет пуст, конструктор вызывает исключение ArgumentException, а если stream равен нулю, вызывается исключение ArgumentNullException. Сразу же после создания класс StreamWriter автоматически выполняет преобразование символов в байты.
В некоторых случаях можно открыть файл напрямую, используя класс StreamWriter. При этом используется один из указанных ниже конструкторов:
StreamWriter (string filename)
StreamWriter (string filename, bool appendFlag)
filename – имя открываемого файла.
При использовании конструктора второго вида данные будут добавляться в конец существующего файла, если флагу appendTrue присвоено значение true. Если же упомянутому флагу присвоено значение false, данные будут вмещать содержимое указанного файла. При отсутствии файла в обоих случаях происходит его создание. Также в обоих случаях генерируется исключение IOException в случае наличия ошибки.
Пример 3.
Рассмотрим пример программы, которая считывает строки текста, введенного с клавиатуры, а затем записывает его в файл test.txt. Считывание текста продолжается до тех пор, пока пользователь не введет слово «stop».
using System;
using System.IO;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
string str;
StreamWriter fstr_out;
try
{
fstr_out = new StreamWriter("test.txt");
}
catch (IOException exc)
{
Console.WriteLine(exc.Message+"Невозможно открыть файл");
return;
}
Console.WriteLine("Введите текст stop для выхода");
do
{
Console.WriteLine("Введите строку файла:");
str = Console.ReadLine();
if (str != "stop")
{
str = str + "\r\n";
try
{
fstr_out.Write(str);
}
catch (IOException exc)
{
Console.WriteLine(exc.Message + "Файловая ошибка");
return;
}
}
}
while (str != "stop");
fstr_out.Close();
}
}
}
Использование класса StreamReader
Для создания символьного потока ввода байтовый поток включается в класс StreamReader следующим образом:
StreamReader(Stream stream)
Параметр stream определяет имя открытого потока. Сразу же после создания класс StreamReader будет автоматически выполнять преобразование байтов в символы.
Пример 4.
Следующая программа считывает текстовый файл test.txt и отображает его содержимое на экране.
using System;
using System.IO;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
string str;
FileStream fin;
try
{
fin = new FileStream("test.txt", FileMode.Open);
}
catch (IOException exc)
{
Console.WriteLine(exc.Message+"Невозможно открыть файл");
return;
}
StreamReader fstr_in = new StreamReader(fin);
while ((str = fstr_in.ReadLine()) != null)
Console.WriteLine(str);
fstr_in.Close();
}
}
}
Обратите внимание на то, каким образом определяется конец файла. Как только ссылка, возвращаемая методом ReadLine, получит значение, равное нулю, это укажет на достижение конца файла.
Как и в случае с классом StreamWriter, в некоторых случаях можно открыть файл непосредственно, воспользовавшись возможностями класса StreamReader. Для выполнения этой операции служит следующий конструктор:
StreamReader(string filename)
Параметр filename указывает имя открываемого файла. Если файл не существует, генерируется исключение IOException. Если параметр filename представляет собой пустую строку, генерируется исключение ArgumentException.