- •1 Файлы и потоки
- •2 Потоки данных и классы
- •2.1 Стандартные потоки
- •2.2 Базовые классы для работы с файлами и потоками
- •2.2.1 Основные классы ввода и вывода
- •2.2.2 Классы на базе FileSystemInfo
- •2.2.3 Классы для работы с потоками
- •2.2.4 Классы для работы с потоками текстовых символов
- •2.3 Перечисления
- •3 Работа со стандартными потоками
- •3.1 Стандартный поток ввода
- •3.2 Стандартный поток вывода
- •3.2.1 Стандартный поток вывода сообщений об ошибках
- •3.3 Программа StdStreams
- •4 Создание потоков, связанных с файлами
- •4.1 Открытие потока FileStream
- •4.2 Открытие потоков BinaryWriter и BinaryReader
- •4.3 Закрытие потоков
- •4.4 Запись двоичных данных
- •4.5 Чтение двоичных данных
- •4.6 Программа Binary
- •4.7 Работа с текстовыми файлами
- •5 Выбор кодировки символов
- •5.1 Кодовые страницы
- •5.2 Недостатки модели кодовых страниц
- •5.3 Стандарт UNICODE
- •5.3.1 Unicode в Microsoft Windows NT/2000/XP
- •5.3.2 UNICODE в Microsoft Windows 95
- •5.4 Кодировка текстовых потоков
- •5.5 Кодировка текстовых строк в двоичных потоках
- •6 Буферизация потоков
- •6.1 Буферизация двоичных потоков
- •6.2 Буферизация текстовых потоков
- •6.3 Принудительный сброс буферов
- •7 Потоки в оперативной памяти
- •7.1 Создание потока
- •7.2 Чтение данных
- •7.3 Запись данных
- •7.4 Доступ к буферу потока MemoryStream
- •7.5 Потоки на базе строк string
- •7.6 Потоки класса StringBuilder
- •8 Краткие выводы
- •8.1 Создание и чтение бинарного файла
- •8.2 Создание текстового файла
- •8.3 Добавление в текстовый файл
- •8.4 Чтение и запись в файл строк на русском языке
- •8.5 Посимвольное чтение текстового файла
- •8.6 Построчное чтение текстового файла
- •8.7 Чтение файла полностью
Вот что появится на консоли после запуска программы:
Text string
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 Файл успешно создан
Содержимое файла, созданного нашей программой, показано на рис. 5.
Рисунок 5: Содержимое созданного двоичного файла
Обратите внимание, что в самом начале файла находится байт со значением ОхВ, вслед за которым идет текстовая строка в кодировке ASCII. Этот байт задает длину строки. Вслед за строкой идут 20 чисел, каждое из которых занимает 4 байта.
4.7 Работа с текстовыми файлами
Хотя рассмотренные в предыдущем разделе потоки FileStream, BinaryWriter и BinaryReader можно использовать для записи в файлы и чтения из файлов текстовых строк, лучше прменять специально предназначенные для этого средства. Речь идет о потоках классов StreamWriter и StreamReader, Эти потоки чрезвычайно просты в использовании и удобны для работы с текстовыми файлами.
Основные приемы использования потоков StreamWriter и StreamReader демонстрируются в программе, исходный текст которой приведен в листинге 3.
Листинг 3.
using System; using System.IO;
namespace TextFile
{
class TextFileApp
{
private const string testFile = "mydata.txt";
static void Main{string[] args)
{
if[File.Exists(testFile))
{
Console.WriteLine("Файл {0) уже существует", testFile); Console.ReadLine(); return;
}
StreamWriter sw = File.CreateText(testFile); sw.WriteLine("Каждый охотник желает знать, где сидит фазан!");
sw.WriteLine ("Число \"Пи\" равно примерно {0}.", 3.1415926); sw.Close();
StreamReader sr = File.OpenText(testFile); while(true)
{
String str = sr.ReadLine();
if(str == null) break; Console.WriteLine(str);
}
sr.Close();
}
}
Как и предыдущая программа (см. листинг 2), наша новая программа сразу после запуска проверяет существование рабочего файла в текущем каталоге:
private const string testFile = "mydata.txt";
if (File.Exists(testFile))
{
Console.WriteLine("Файл {0} уже существует", testFile); Console.ReadLine();
return;
}
Если файл с именем mydata.txt существует а текущем каталоге, программа завершает свою работу с сообщением об ошибке. В противном случае программа создает текстовый файл и открывает поток для работы с ним класса StreamWriter:
StreamWriter sw = File.CreateText(testFile);
Как видите, эта операция выполняется методом CreateText, определенным в классе File. Аналогичного эффекта можно было бы достичь и с помощью следующего конструктора класса StreamWriter:
StreamWriter sw = new StreamWriter(testFile, false);
Первый параметр этого конструктора определяет полный путь к открываемому файлу. Если значение второго параметра равно true, новые данные будут добавлены к файлу, а если false — содержимое файла будет перезаписано.
Для открытия текстового файла на запись вы можете использовать любой из этих конструкторов. Заметим, что в классе StreamWriter имеются и другие конструкторы, позволяющие, например, задать кодировку текстовых символов, записываемых в файл.
После того как поток StreamWriter открыт, программа может записывать в него текстовые строки, пользуясь хорошо известными вам методами Write и WriteLine:
sw.WriteLine("Каждый охотник желает знать, где сидит фазан!"); sw.WriteLine ("Число \"Пи\" равно примерно (0).", 3.1415926);
Когда запись новых данных в поток завершена, необходимо закрыть поток методом Close:
sw.Close();
Теперь о чтении данных из текстового файла.
Прежде всего программа должна открыть поток класса StreamReader, привязав его к файлу. Это можно сделать методом File . OpenText:
StreamReader sr = File.OpenText(testFile);