Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторная работа №3 ООП.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
115.71 Кб
Скачать
    1. Ввод/вывод в символьные файлы

Для автоматического преобразования байтовых потоков в символьные и наоборот используются классы 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.