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

  • docx
  • 18.11.2021
Публикация на сайте для учителей

Публикация педагогических разработок

Бесплатное участие. Свидетельство автора сразу.
Мгновенные 10 документов в портфолио.

Иконка файла материала Л2-002145.docx

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

 

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

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

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

 

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

 

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

 

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

 

 

 

 

 

 

 

 

Память


 

Файл


 

 

 

байт,байт,…


MemoryStream FileStream

Байтовый поток


StreamReader / StreamWriter

 

 

байт+байт+…+\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), то не забудьте ее оформить как строку:

 

Enter

 

 


13   10

\r     \n


Environment.NewLine

 

 

 

И	в	а	н	о	в	CR	LF

рис. 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).