Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Чтение и запись текста (символьные потоки)






 

Символьные потоки работают с любой кодировкой.

Чтобы выполнять файловые операции на символьной основе, поместите объект класса FileStream внутрь объекта класса StreamReader или класса StreamWriter.

Эти классы автоматически преобразуют байтовый поток в строки и наоборот.

 

ОСОБЕННОСТИ:

 

Метод StreamReader.ReadLine() автоматически опреде­ляет конец строки и прекращает чтение в этом месте.

 

Метод StreamWriter.Writer() автоматически добавляет комбинацию конца строки (\r\n – возврат каретки, перевод строки).

 

рис.8

Присоединение файла или потока к классам StreamReader или StreamWriter

 

Класс StreamReader можно использовать для чтения данных из любого источника. Для этого вместо применения имени файла в конструкторе можно применять ссылку на другой поток. Например, в классе FileInfo существуют методы OpenText() и CreateText(), которые возвращают ссылки на StreamReader.

Класс StreamWriter можно использовать для записи данных в любой приемник.

 

Класс StreamReader — производный от TextReader.

Класс StreamWriter — производный от класса TextWriter.

 

Следовательно, классы StreamWriter и StreamReader имеют доступ к методам и свойствам, определенным их базовыми классами.

 

StreamReader

В классе StreamReader определено несколько конструкторов. Чаще всего используются следующие конструкторы, которые проверяют маркеры кодировки в начале файла (2-3 символа):

 

StreamReader (string path) //прямое присоединение StreamReader к файлу

 

path – полный путь (имя файла). Файл должен существовать.

 

StreamReader (Stream stream) // присоединение StreamReader к потоку

 

stream - имя открытого потока.

 

Примеры.

 

1) StreamReader sr = new StreamReader(@" c: \Temp\ReadMy.txt");

 

2) FileStrim fs = new FileStrim (@" c: \Temp\ReadMy.txt",

FileMode.Open, FileAccess.Read, FileShare.None);

StreamReader sr = new StreamReader(fs);

 

Методы чтения:

string str = sr.ReadLine(); // читать строку, null - EOF

 

string str2 = sr.ReadToEnd(); // прочитать весь остаток файла

 

int nextChar = sr.Read (); // прочитать один символ (-1 = EOStrim)

 

char[ ] chr = new char[100];

int n = sr.Read(chr, 0, 100); // 100 символов со смещением 0

// n – реально прочитанное кол-во

 

Возвращаемая строка не содержит завершающий знак возврата каретки или перевода строки.

 

Если ссылка, возвра­щаемая методом ReadLine(), равна значению null, значит, достигнут конец файла.

 

StreamWriter

Самые популярные конструкторы класса StreamWriter:

 

StreamWriter (string path)

 

StreamWriter (Stream stream)

 

StreamWriter (string filename, bool appendFlag)

 

Если appendFlag равен значению true, выводимые данные добавляются в конец существующего файла. В противном случае заданный файл перезаписывается. В последних двух случаях, если файл не существует, он создается.

Примечание. Применяется кодировка UTF8, принятая в.NET по умолчанию. Для смены – другие конструкторы.

 

Методы записи:

 

string str;

sr.WriteLine(str); // записать строку

 

char chr1 = ‘a’;

sr.Write(chr1); // записать один символ

 

char[ ] chr = new char[100];

sr.Write (chr); // записать 100 символов

 

char[ ] chr = new char[100];

sr.Write (chr, 25, 50); // записать 50 символов с 25-ого

 

Если вы сами формируете строку из последовательности символов (для Write), то не забудьте ее оформить как строку:

 

       
 
   
Environment.NewLine
 

 


рис. 9

 

Пример чтения/записи. (Без обработки исключений.)

 

/* Простая утилита " клавиатура-диск"

демонстрирует использование класса StreamWriter. */

 

using System;

using System.IO;

 

class KtoD

{

public static void Main()

{

string str;

FileStream fout;

 

fout = new FileStream (" test.txt", FileMode.Create);

StreamWriter sout = new StreamWriter (fout);

 

Console.WriteLine (" Введите текст ('стоп' для завершения).");

while (true);

{

str = Console.ReadLine();

 

if (str = " стоп") break;

{

str = str + " \r\n"; // Добавляем символы новой строки.

sout.Write(str);

}

}

 

sout.Close();

}

}

 

Исключения:

ArgumentException поток stream не открыт для ввода/вывода
ArgumentNullException поток stream имеет null-значение
FileNotFoundException Не удается найти файл (для path).
DirectoryNotFoundException Указанный путь (path) недопустим; возможно, он отсылает к неотображенному диску.
IOException Параметр path включает неправильный или недопустимый синтаксис имени файла, имени папки или метки тома.

 

Пример. (С обработкой исключений.)

 

/* Простая утилита " клавиатура-диск", которая

демонстрирует использование класса StreamWriter. */

using System;

using System.IO;

 

class KtoD

{

public static void Main()

{

string str;

FileStream fout;

 

try

{

fout = new FileStream(" test.txt", FileMode.Create);

}

catch (IOException exc)

{

Console.WriteLine(exc.Message + " He удается открыть файл.");

return;

}

 

StreamWriter fstr_out = new StreamWriter(fout);

 

Console.WriteLine(" Введите текст ('стоп' для завершения).");

do

{

Console.Write(": ");

str = Console.ReadLine();

 

if (str! = " стоп")

{

str = str + " \r\n"; // Добавляем символ новой строки.

 

try

{

fstr_out.Write(str);

}

catch (IOException exc)

{

Console.WriteLine(exc.Message + " Ошибка при работе с файлом.");

return;

}

}

} while (str! = " стоп");

 

fstr_out.Close();

}

}

 

Следующая программа создает простую утилиту " диск - клавиатура", которая счи­тывает текстовый файл test.txt и отображает его содержимое на экране. Таким об­разом, эта программа представляет собой дополнение к утилите, представленной ранее.

Пример. (Без обработки исключений.)

// Простая утилита " диск - клавиатура" демонстрирует

// использование класса StreamReader.

using System;

using System.IO;

 

class DtoK

{

public static void Main()

{

string s;

 

FileStream fin = new FileStream (" test.txt", FileMode.Open);

 

StreamReader sin = new StreamReader(fin);

 

// Считываем файл построчно.

while ((s = sin.ReadLine())! = null)

{

Console.WriteLine(s);

}

 

sin.Close();

}

}

 

Пример. (С обработкой исключений.)

 

using System;

using System.IO;

 

class DtoS

{

public static void Main()

{

string s;

FileStream fin;

 

try

{

fin = new FileStream (" test.txt", FileMode.Open);

}

catch (FileNotFoundException exc)

{

Console.WriteLine(exc.Message + " He удается открыть файл.");

return;

}

 

StreamReader fstr_in = new StreamReader(fin);

 

// Считываем файл построчно.

while ((s = fstr_in.ReadLine())! = null)

{

Console.WriteLine(s);

}

 

fstr_in.Close();

}

}

 

Пример открытия выходного файла классом StreamWriter. (Без обработки исключений.) Новая версия предыдущей утилиты " клавиатура-диск".

 

// Открытие файла с использованием класса StreamWriter.

 

using System;

using System.IO;

 

class KtoD

{

public static void Main()

{

string str;

 

// Открываем файл напрямую, используя класс StreamWriter.

StreamWriter sout = new StreamWriter (" test.txt");

 

Console.WriteLine (" Введите текст ('стоп' для завершения).");

do

{

Console.Write (": ");

str = Console.ReadLine();

 

if (str! = " стоп")

{

str = str + " \r\n"; // Добавляем символ новой строки

sout.Write(str);

}

} while (str! = " стоп");

 

sout.Close();

}

}

 

Если файл не существует, то он создается. У конструктора класса FileStreem возможностей больше.

 

Кодировка текстовых потоков

 

В C# используются следующие статические свойства класса System.Text.Encoding для кодировки текстовых потоков

Кодировка Описание
ASCII Кодировка ASCII без символов кириллицы, в которой для представления текстовых символов используются младшие 7 бит байта
Unicode Кодировка UNICODE. Для представления символов используется 16 бит (т. е. 2 байта). Сигнатура = FF FE в нач.файла для StreamWriter
UTF7 Кодировка UCS Transformation Format. Применяется для представления символов UNICODE. В ней используются младшие 7 бит данных
UTF8 To же, но для представления символов UNICODE в ней используется 8 бит данных
Default Системная кодировка ANSI (не путайте ее с кодировкой ASCII). В этой кодировке для представления каждого символа используется 8 бит данных

 

 

Свойства класса кодировки System.Text.Encoding:

ASCII – 1 байт (старший бит = 0);

Default – по умолчанию (UTF8);

Unicode – 2 байта;

UTF32 – 4 байта;

UTF7 – 1 байт, старший бит не используется;

UTF8 – 1 байт (по умолчанию в.NET).

 

 







© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.