. Это делается так, потому что имеется возможность альтернативного возврата -1, если будет достигнут конец потока.
Наконец, можно прочитать заданное число символов в массив с использованием смещения:
// прочитать 100 символов
int nChars = 100;
chr [] CharArray = new char[nChars];
int nCharsRead = sr.Read(CharArray, 0, nChars);
nCharsRead
будет меньше
nChars
, если запрос чтения потребует больше символов, чем осталось в файле.
Класс StreamWriter
Он работает практически таким же образом, как и
StreamReader
, за исключением того только, что
StreamWriter
используется для записи в файл (или в другой поток). Возможности создания
StreamWriter
включают в себя:
StreamWriter sw = new StreamWriter(@"C:\My Documents\ReadMe.txt");
Приведенный выше код будет использовать кодирование UTF8, которое рассматривается в .NET как метод кодирования по умолчанию. Если желательно определить альтернативное кодирование:
StreamWriter sw = new StreamWriter(@"C:\My Docurnents\ReadMe.txt", true, Encoding.ASCII);
В этом конструкторе вторым параметром является Boolean, который указывает, должен ли файл быть открыт для добавления. Странно, но не существует конструктора, который получает только имя файла и класс кодирования.
Конечно, можно соединить
StreamWriter
с файловым потоком, чтобы предоставить больший контроль над параметрами открытия файла:
FileStream fs = new FileStream(@"C:\Му Documents\ReadMe.txt",
, но предполагает, что считываемый файл является текстовым файлом, и выводит его в этом виде. Он может сохранить файл (со всеми изменениями, которые будут сделаны в тексте в текстовом поле). Он будет сохранять любой файл в формате Unicode.
Снимок показывает использование
ReadWriteText
для вывода того же файла
CivNegotiations
, который использовался раньше. В этот раз, однако, мы сможем прочитать содержимое гораздо легче.
Не будем вдаваться в детали добавления методов обработки событий для диалога открытия файла, поскольку они по сути такие же, что и в примере
BinaryFileReader
. Как и для данного примера, открытие нового файла приводит к вызову метода
DisplayFile
. Единственное реальное различие между этим примером и предыдущим состоит в реализации
DisplayFile
, а также в том факте, что теперь имеется возможность сохранить файл. Она представлена другим пунктом меню — save. Обработчик для этого пункта вызывает другой добавленный в код метод —
SaveFile
. (Отметим, что этот файл всегда перезаписывает первоначальный файл, этот пример не имеет возможности записи в другой файл.)
Посмотрим сначала на
SaveFile
, так как это простейшая функция. Мы просто записываем каждую строку текстового поля по очереди в поток
StreamWriter
, полагаясь на метод
StreamReader.WriteLine
для добавления комбинации возврата каретки-перевода строки в конце каждой строки:
void SaveFile {
StreamWriter sw = new StreamWriter(ChosenFile, false, Encoding.Unicode);
foreach (string Line in textBoxContents.Lines) sw.WriteLine(Line);
sw.Close;
}
ChosenFile
является строковым полем основной формы, которое содержит имя прочитанного файла (как и в предыдущем примере). Отметим, что при открытии потока определяется кодирование Unicode. Если желательно записывать файлы в другом формате, необходимо изменить значение этого параметра. Второй параметр в этом конструкторе будет задан как true, если мы хотим добавлять к файлу, но в данном случае мы этого не делаем. Кодирование должно задаваться во время создания объекта записи потока. В дальнейшем оно доступно только для чтения как свойство