Binary read/write

Run Settings
LanguageC#
Language Version
Run Command
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); // Для сохранения студента вызывается // соответствующий метод из класса Student for(int i = 0; i < st.Length; i++) st[i].Write(bw); } // Статический метод для чтения из файла информации // и создания нового объекта на ее основе public static Group Read(BinaryReader br) { string gn = br.ReadString(); int n = br.ReadInt32(); Student [] st = new Student[n]; // Для считывания студента вызывается соотв. метод из класса Student for(int i = 0; i < n; i++) 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("Group-123", 5); 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(); } } }
Editor Settings
Theme
Key bindings
Full width
Lines