- Автор темы
- #1
Практический пример. Чтение произвольных файлов в шестнадцатеричном режиме.
Данная программа отображает указанный пользователем файл на экран в шестнадцатеричном виде (а-ля текстовый редактор в FAR'е). Файл считывается в виде массива байт.
Практический пример. Чтение и запись двоичных данных.
Данная программа производит запись в файл и чтение из файла двоичных данных. В примере также показан механизм сохранения и загрузки данных класса в (из) файл (-а).
Данная программа отображает указанный пользователем файл на экран в шестнадцатеричном виде (а-ля текстовый редактор в FAR'е). Файл считывается в виде массива байт.
Код:
using System;
using System.IO;
namespace CSharpApplication.ReadFileInTextMode
{
// Класс для считывания и отображения файла в 16-чном режиме
class ReadHexFile
{
static void Main(string [] args /* Параметры командной строки */)
{
string FileName;
// Если параметров командной строки нет
if(args.Length == 0)
{
Console.Write("Введите путь к файлу: ");
FileName = Console.ReadLine();
}
else
{
FileName = args[0];
}
FileStream fs = null;
try
{
// Открываем поток на чтение
fs = new FileStream(FileName, FileMode.Open,
FileAccess.Read);
}
catch(Exception exc)
{
// Вывод сообщения об ошибке
Console.WriteLine(exc.Message);
return;
}
// Выделяем массив под размер файла
byte [] arr = new byte[fs.Length];
// Считываем весь файл в массив
int N = fs.Read(arr, 0, (int)fs.Length);
// Закрываем поток
fs.Close();
int i = 0, j = 0, k = 0;
// Отображаем информацию
for(i = 0; i < N; i += 16)
{
Console.Write("{0:X8}", i);
for(j = 0; j < 16 && j + i < N; j++)
{
Console.Write("{0,3:X2}", arr[j + i]);
}
for(k = 0; k < 17 - j; k++)
Console.Write("{0,3}", ' ');
for(j = 0; j < 16 && j + i < N; j++)
{
// Если управляющий символ
if(Char.IsControl((char)arr[j + i]))
Console.Write('.');
else
Console.Write((char)arr[j + i]);
}
Console.WriteLine();
}
}
}
}
Практический пример. Чтение и запись двоичных данных.
Данная программа производит запись в файл и чтение из файла двоичных данных. В примере также показан механизм сохранения и загрузки данных класса в (из) файл (-а).
Код:
using System;
using System.IO;
using System.Text;
namespace CSharpApplication.ReadWriteBinaryData
{
// Класс студент
class Student
{
// Имя
string firstname;
// Фамилия
string lastname;
// Адрес
string address;
// Телефон
string phone;
// Дата рождения
DateTime birthday;
// Номер зачетки
int number;
// Свойства
public string FirstName
{
get
{
return firstname;
}
set
{
firstname = value;
}
}
public string LastName
{
get
{
return lastname;
}
set
{
lastname = value;
}
}
public string Address
{
get
{
return address;
}
set
{
address = value;
}
}
public string Phone
{
get
{
return phone;
}
set
{
phone = value;
}
}
public DateTime BirthDay
{
get
{
return birthday;
}
set
{
birthday = value;
}
}
public int Number
{
get
{
return number;
}
set
{
number = value;
}
}
// Поверхностное копирование объекта
public Student Clone()
{
// Вызываем функцию базового класса (Object)
// для поверхностного копирования объекта
return (Student)MemberwiseClone();
}
// Ввод данных
public void Input()
{
Console.WriteLine("*****Ввод данных о студенте:******");
Console.Write("Имя: ");
firstname = Console.ReadLine();
Console.Write("Фамилия: ");
lastname = Console.ReadLine();
Console.Write("Адрес: ");
address = Console.ReadLine();
Console.Write("Телефон: ");
phone = Console.ReadLine();
Console.Write("Дата рождения: ");
try
{
// Считывание даты
birthday = Convert.ToDateTime(Console.ReadLine());
}
catch
{
Console.WriteLine("Ошибка ввода, используем текущую дату");
birthday = DateTime.Now;
}
Console.Write("Номер зачетки: ");
try
{
number = Convert.ToInt32(Console.ReadLine());
}
catch
{
Console.WriteLine("Ошибка ввода, используется номер 0");
number = 0;
}
Console.WriteLine("**********************************");
}
// Вывод данных
public void Print()
{
Console.WriteLine("*****Вывод данных о студенте:*****");
Console.WriteLine("Имя: {0}", firstname);
Console.WriteLine("Фамилия: {0}", lastname);
Console.WriteLine("Адрес: {0}", address);
Console.WriteLine("Телефон: {0}", phone);
Console.WriteLine("Дата рождения: {0}.{1}.{2}",
birthday.Day, birthday.Month, birthday.Year);
Console.WriteLine("Номер зачетки: {0}", number);
Console.WriteLine("**********************************");
}
// Запись в файл
public void Write(BinaryWriter bw)
{
// Все данные записываются по отдельности
bw.Write(firstname);
bw.Write(lastname);
bw.Write(address);
bw.Write(phone);
bw.Write(birthday.Year);
bw.Write(birthday.Month);
bw.Write(birthday.Day);
bw.Write(number);
}
// Статический метод для чтения из файла информации
// и создания нового объекта на ее основе
public static Student Read(BinaryReader br)
{
// Считывание производится в порядке,
// соответствующем записи
Student st = new Student();
st.firstname = br.ReadString();
st.lastname = br.ReadString();
st.address = br.ReadString();
st.phone = br.ReadString();
int year = br.ReadInt32();
int month = br.ReadInt32();
int day = br.ReadInt32();
st.birthday = new DateTime(year, month, day);
st.number = br.ReadInt32();
return st;
}
}
// Класс Group
class Group : ICloneable
{
// Название группы
string groupname;
// Массив студентов
Student [] st;
// Свойства
public string GroupName
{
get
{
return groupname;
}
set
{
groupname = value;
}
}
public Student [] Students
{
get
{
return st;
}
set
{
st = value;
}
}
// Конструктор, получающий название группы и количество студентов
public Group(string gn, int n)
{
groupname = gn;
// По умолчанию в группе 10 студентов
if(n < 0 || n > 10)
n = 10;
st = new Student[n];
// Создаем студентов
for(int i = 0; i < n; i++)
st[i] = new Student();
}
// Аналог конструктора копирования
public Group(Group gr)
{
// Создаем массив студентов
st = new Student[gr.st.Length];
// Передираем название группы
groupname = gr.groupname;
// Передираем каждого индивидуума
for(int i = 0; i < gr.st.Length; i++)
st[i] = gr.st[i].Clone();
}
// Заполняем группу
public void Input()
{
for(int i = 0; i < st.Length; i++)
{
Console.WriteLine("{0}.", i + 1);
st[i].Input();
}
}
// Изменение данных конкретного студента
public void InputAt(int n)
{
if(st == null || n >= st.Length || n < 0)
return;
st[n].Input();
}
// Вывод списка группы
public void Print()
{
Console.WriteLine("Группа {0}:", groupname);
for(int i = 0; i < st.Length; i++)
{
Console.WriteLine("{0}.", i + 1);
st[i].Print();
}
}
// Вывод информации о конкретном студенте
public void PrintAt(int n)
{
if(st == null || n >= st.Length || n < 0)
return;
st[n].Print();
}
// "Глубокое" копирование,
// реализация функции из интерфейса IClonable
public object Clone()
{
// Создание новой группы
Group gr = new Group(groupname, st.Length);
// Передираем каждого индивидуума
for(int i = 0; i < st.Length; i++)
gr.st[i] = st[i].Clone();
// Возврат независимой копии группы
return gr;
}
// Запись в файл
public void Write(BinaryWriter bw)
{
// Сохраняем название группы
bw.Write(groupname);
// Сохраняем количество студентов
bw.Write(st.Length);
for(int i = 0; i < st.Length; i++)
// Для сохранения студента вызывается
// соответствующий метод из класса Student
st[i].Write(bw);
}
// Статический метод для чтения из файла информации
// и создания нового объекта на ее основе
public static Group Read(BinaryReader br)
{
string gn = br.ReadString();
int n = br.ReadInt32();
Student [] st = new Student[n];
for(int i = 0; i < n; i++)
// Для считывания студента вызывается
// соответствующий метод из класса Student
st[i] = Student.Read(br);
// Создаем пустую группу
Group gr = new Group(gn, 0);
// Записываем в нее студентов
gr.st = st;
return gr;
}
}
// Тестирование
class Test
{
static void Main()
{
// Группа
Group gr = new Group("АС-951", 3);
gr.Input();
gr.Print();
// Создаем поток для создания файла и/или записи в него
FileStream fs = new FileStream("group.bin",
FileMode.OpenOrCreate, FileAccess.Write);
// Создаем двоичный поток для записи
BinaryWriter bw = new BinaryWriter(fs, Encoding.Default);
// Пишем данные
gr.Write(bw);
// Закрываем потоки
bw.Close();
fs.Close();
// Создаем поток для чтения из файла
fs = new FileStream("group.bin",
FileMode.Open, FileAccess.Read);
// Создаем двоичный поток для чтения
BinaryReader br = new BinaryReader(fs, Encoding.Default);
// Читаем данные
gr = Group.Read(br);
// Закрываем потоки
br.Close();
fs.Close();
gr.Print();
}
}
}