- •Лекция 11. Файлы в с# Основные понятия. Классы .Net для работы с файлами
- •Виды файлов
- •Алгоритм работы с файловыми потоками
- •Байтовые файлы (потоки)
- •Обработка исключительных ситуаций при работе с файлами
- •Текстовые файлы
- •Пример преобразования чисел, содержащихся в текстовом файле
- •Консольный ввод-вывод
- •Работа с каталогами и файлами
Пример преобразования чисел, содержащихся в текстовом файле
В данном примере вычисляется сумма чисел в каждой строке.
На содержимое файла накладываются весьма строгие ограничения: числа должны быть разделены ровно одним пробелом, после последнего числа в строке пробела быть не должно, файл не должен заканчиваться символом перевода строки.
using System;
using System.IO;
namespace ConsoleApplication1
{ class Class1
{ static void Main()
{
try
{
StreamReader f=new StreamReader ("numbers.txt");
string s;
const int n= 20;
int []a=new int[n];
string [] buf;
while((s=f.ReadLine()) != null)
{
buf = s.Split(' ');
long sum=0;
for (int i=0; i<buf.Length; ++i)
{
a[i]=Convert.ToInt32(buf[i]);
sum+=a[i];
}
Console.WriteLine("{0} сумма: {1}", s, sum);
Console.ReadKey();
}
f.Close();
}
catch (FileNotFoundException e)
{ Console.WriteLine(e.Message);
Console.WriteLine("Проверьте правильность имени файла!");
Console.ReadKey();
return; }
catch (Exception e)
{ Console.WriteLine("Error:" + e.Message);
Console.ReadKey();
return; } } }}
Результат работы программы: 1 2 4 сумма: 7 3 44 -3 6 сумма: 50 8 1 1 сумма: 10
Двоичные файлы
Двоичные файлы хранят данные в том же виде, в котором они представлены в оперативной памяти, то есть во внутренней форме представления. Двоичные файлы применяются не для просмотра их человеком, а для использования в программах. Выходной поток BinaryWriter поддерживает произвольный доступ, то есть имеется возможность выполнять запись в произвольную позицию двоичного файла.
Двоичный файл открывается на основе базового потока, в качестве которого чаще всего используется поток FileStream. Входной двоичный поток содержит перегруженные методы чтения для всех простых встроенных типов данных.
Основные методы двоичных потоков приведены в таблицах 11.7 и 11.8
Таблица 11.7 – Основные элементы класса BinaryWriter
Элемент Описание
BaseStream Базовый поток, с которым работает объект BinaryWriter
Close Закрыть поток
Flush Очистить буфер
Seek Установить позицию в текущем потоке
Write Записать значение вы текущий поток
Таблица 11.8 -Наиболее важные элементы класса BinaryReader
Элемент Описание
BaseStream Базовый поток, с которым работает BinaryReader
Close Закрытый поток
PeekChar Возвратить следующий символ без перемещения
внутреннего указателя в потоке
Read Считать поток байтов или символов и сохранить в
массиве,
передаваемом как входной параметр
ReadXXXX Считать из потока данные определенного типа(например, ReadBoolean, ReadByte, ReadInt32)
_________________________________________________________________________________
В приведенном ниже примере формируется двоичный файл. В него записывается последовательность вещественных чисел, а затем для демонстрации произвольного доступа третье число заменяется числом 8888.
Пример формирования двоичного файла
using System;
using System.IO;
namespace ConsoleApplication1
{
class Class1
{
static void Main()
{
try
{
BinaryWriter fout = new BinaryWriter(
new FileStream(@"E:\11.txt", FileMode.Create));
double d = 0;
while (d < 4)
{
fout.Write(d);
d += 0.33;
};
fout.Seek(16, SeekOrigin.Begin); //второй элемент файла
fout.Write(8888d);
fout.Close();
}
catch (Exception e)
{ Console.WriteLine("Error:" + e.Message);return;}}}}
При создании двоичного файла в него передается объект базового потока. При установке указателя текущей позиции в файле учитывается длина каждого значения типа double – 8 байт.
Для просмотра сформированного файла с помощью экземпляра BinaryReader считывается содержимое файла в массив вещественных чисел, а затем выводится этот массив на экран.
При чтении метод ReadDouble при обнаружении конца файла генерирует исключение EndOfStreamException. Поскольку в данном случае это не ошибка, тело обработчика исключений пустое.
Пример чтения двоичного файла
using System;
using System.IO;
namespace ConsoleApplication1
{ class Class1
{ static void Main()
{
try
{
FileStream f=
new FileStream( @"E:\11.txt", FileMode.Open);
BinaryReader fin=new BinaryReader(f);
long n=f.Length/8; //количество чисел в файле
double[] x=new double[n];
long i=0;
try
{
while(true) x[i++]=fin.ReadDouble(); //чтение
}
catch (EndOfStreamException e) {}
foreach (double d in x) Console.Write(" "+d); //вывод
fin.Close(); Console.ReadKey();
f.Close();
}
catch (FileNotFoundException e)
{ Console.WriteLine(e.Message);
Console.WriteLine("Проверьте правильность имени файла!");
return;
}
catch (Exception e)
{Console.WriteLine("Error:" + e.Message); return; }}}}
Результат работы программы: