Редактирование бинарных файлов
Проблема в том что есть бинарный файл (Students.bin) нужно написать редактирование студента по айди (вводится айди и по нему нужно редактировать данные) не могу записать измененные данный, а когда они записываются то не полностью и возникает ошибка что нельзя считать данные поза потоком.Метод SelectWhatEditStudent Все методы и функции которые нужно знать для исправления находятся в проекте (ссылка на скачивание проекта ниже, потому что не могу вставить так много кода) Administrator.cs. Ссылка на скачивание проекта https://dropmefiles.com/giH61 Текст ошибки при первом запуске
Wyjatek nieobsluzony: System.ArgumentNullException: Wartosc nie moze byc zerowa. Nazwa parametru: value w System.IO.BinaryWriter.Write(String value) w Electronic_journal.Student.SaveStudents(List`1 students) w C:\Users\User\Desktop\Electronic_journal\Electronic_journal\Electronic_journal\E>lectronic_journal\Student.cs:wiersz 144 w Electronic_journal.Administrator.SelectWhatEditStudent(Int32 ID) w C:\Users\User\Desktop\Electronic_journal\Electronic_journal\Electronic_journal\Electronic_journal\Administrator.cs:wiersz 143 w Electronic_journal.Administrator.EditStudent() w C:\Users\User\Desktop\Electronic_journal\Electronic_journal\Electronic_journal\Electronic_journal\Administrator.cs:wiersz 77 w Electronic_journal.MenuProgram..ctor() w C:\Users\User\Desktop\Electronic_journal\Electronic_journal\Electronic_journal\Electronic_journal\MenuProgram.cs:wiersz 122 w Electronic_journal.Program.Main(String[] args) w C:\Users\User\Desktop\Electronic_journal\Electronic_journal\Electronic_journal\Electronic_journal\Program.cs:wiersz 13
Текст ошибки при втором запуске
Wyjatek nieobsluzony: System.ArgumentNullException: Wartosc nie moze byc zerowa. Nazwa parametru: value w System.IO.BinaryWriter.Write(String value) w Electronic_journal.Student.SaveStudents(List`1 students) w C:\Users\User\Desktop\Electronic_journal\Electronic_journal\Electronic_journal\Electronic_journal\Student.cs:wiersz 143 w Electronic_journal.Administrator.SelectWhatEditStudent(Int32 ID) w C:\Users\User\Desktop\Electronic_journal\Electronic_journal\Electronic_journal\Electronic_journal\Administrator.cs:wiersz 126 w Electronic_journal.Administrator.EditStudent() w C:\Users\User\Desktop\Electronic_journal\Electronic_journal\Electronic_journal\Electronic_journal\Administrator.cs:wiersz 77 w Electronic_journal.MenuProgram..ctor() w C:\Users\User\Desktop\Electronic_journal\Electronic_journal\Electronic_journal\Electronic_journal\MenuProgram.cs:wiersz 122 w Electronic_journal.Program.Main(String[] args) w C:\Users\User\Desktop\Electronic_journal\Electronic_journal\Electronic_journal\Electronic_journal\Program.cs:wiersz 13
Код класса Student
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.Serialization.Formatters.Binary;
using System.Text;
using System.Threading.Tasks;
namespace Electronic_journal
{
class Student
{
public int Id = -1;//Айди студента (индификатор, личный номер)
public string Surname { get; set; }//Фамилия
public string Name { get; set; }//Имя
public string Middlename { get; set; }//Очество
public int Age { get; set; }//Возраст
public int Year_of_Birth { get; set; }//Год рождения
public string Group { get; set; }//Группа (можно с буквами)
public string Login { get; set; }//Логин
public string Password { get; set; }//Пароль
public static int CurrentId = -1;
///SET Задаем значение переменным
public void SetSurname()//Задаем фамилию
{
Console.WriteLine("Введите фамилию: ");
Surname = Console.ReadLine();
}
public void SetName()//Задаем имя
{
Console.WriteLine("Введите имя: ");
Name = Console.ReadLine();
}
public void SetMiddlename()//Задаем очество
{
Console.WriteLine("Введите отчество: ");
Middlename = Console.ReadLine();
}
public void SetYear_of_birth()//Задаем год рождения
{
Console.WriteLine("Введите год рождение: ");
string temp = Console.ReadLine();
Year_of_Birth = Int32.Parse(temp);
}
//TODO: norm age (now is -....)
public void SetAge()//Задаем возраст
{
//DateTime moment = new DateTime();
//int year = moment.Year;
//int year;
//DateTime year = DateTime.Today;
DateTime moment = new System.DateTime();
// int year = moment.Year;
DateTime dt = DateTime.Now;
int year = dt.Year;
Age = year - Year_of_Birth;
}
public void SetGroup()//Задаем группу
{
Console.WriteLine("Введите группу: ");
Group = Console.ReadLine();
}
public void SetLogin()//Задаем логин
{
Console.WriteLine("Введите логин: ");
Login = Console.ReadLine();
}
public void SetPassword()//Задаем пароль
{
Console.WriteLine("Введите пароль: ");
Password = Console.ReadLine();
}
public static int GetLastId()//Получаем последний Id
{
return ++CurrentId;
}
public int NormId;
public void SetIdd()
{
CurrentId = LoadStudentsId() + 1;
}
public void SetAll()//Задаем все переменные
{
//++Id;
SetSurname();
SetName();
SetMiddlename();
SetYear_of_birth();
SetAge();
SetGroup();
SetLogin();
SetPassword();
//GetLastId();
}
public string path = "Students.bin";
public int LoadStudentsId()
{
using (BinaryReader br = new BinaryReader(new FileStream(path, FileMode.Open, FileAccess.Read)))
{
List<Student> students = new List<Student>();
while (br.PeekChar() > -1)
{
++Id;
Student student = new Student();
student.Id = br.ReadInt32();
student.Surname = br.ReadString();
student.Name = br.ReadString();
student.Middlename = br.ReadString();
student.Year_of_Birth = br.ReadInt32();
student.Age = br.ReadInt32();
student.Group = br.ReadString();
student.Login = br.ReadString();
student.Password = br.ReadString();
students.Add(student);
}
return ++Id;
}
}
public override string ToString()
{
return $"{Id}: {Surname} {Name} {Middlename}, {Year_of_Birth}, {Age} лет Группа: {Group}, {Login}:{Password}";
}
public void SaveStudents(List<Student> students)
{
using (BinaryWriter bw = new BinaryWriter(new FileStream(path, FileMode.Append, FileAccess.Write)))
{
foreach (Student student in students)
{
bw.Write(student.Id);
bw.Write(student.Surname);
bw.Write(student.Name);
bw.Write(student.Middlename);
bw.Write(student.Year_of_Birth);
bw.Write(student.Age);
bw.Write(student.Group);
bw.Write(student.Login);
bw.Write(student.Password);
}
}
}
public List<Student> LoadStudents()
{
using (BinaryReader br = new BinaryReader(File.OpenRead("Students.bin")))
{
List<Student> students = new List<Student>();
while (br.PeekChar() > -1)
{
Student student = new Student();
student.Id = br.ReadInt32();
student.Surname = br.ReadString();
student.Name = br.ReadString();
student.Middlename = br.ReadString();
student.Year_of_Birth = br.ReadInt32();
student.Age = br.ReadInt32();
student.Group = br.ReadString();
student.Login = br.ReadString();
student.Password = br.ReadString();
students.Add(student);
}
return students;
}
}
public void Povtor()
{
string pow = "";
Console.WriteLine("Повторить регистрацию студента?");
pow = Convert.ToString(Console.ReadLine());
if (pow == "да")
{
Student s = new Student();
s.SetIdd();
int q = Student.CurrentId;
s.SetAll();
List<Student> students = new List<Student>();
students.Add(new Student
{
Id = q,
Surname = s.Surname,
Name = s.Name,
Middlename = s.Middlename,
Year_of_Birth = s.Year_of_Birth,
Age = s.Age,
Group = s.Group,
Login = s.Login,
Password = s.Password
});
s.SaveStudents(students);
List<Student> loadedStudents = s.LoadStudents();
foreach (Student student in loadedStudents)
Console.WriteLine(student);
}
else
{
Environment.Exit(0);
}
}
public void ViewMarks(int ID)
{
Marks m = new Marks();
List<Marks> loadedMarks = m.LoadMarks();
foreach (Marks mark in loadedMarks)
Console.WriteLine(mark);
var selectmarks = from mar in loadedMarks
where mar.IdStudent == ID
select mar;
foreach(Marks mark in selectmarks)
{
Console.WriteLine("{ mark.Mark} { mark.dm} { mark.Subject} ");
}
}
}
}
Метод в котором ошибка
public void SelectWhatEditStudent(int ID)
{
string n, sur, mid, grup, log, pas;
int ye, i;
Student s = new Student();
List<Student> loadedStudents = s.LoadStudents();
var select = from stu in loadedStudents
where stu.Id == ID
select stu;
var r = select.ToList();
foreach(Student studen in r)
{
i = studen.Id;
n = studen.Name;
sur = studen.Surname;
mid = studen.Middlename;
grup = studen.Group;
log = studen.Login;
pas = studen.Password;
ye = studen.Year_of_Birth;
}
List< Student > students = new List<Student>();
string[] items = new string[] { "Сделай выбор оперции, выбирай стрелками вниз-вверх, что бы поддтвердить нажми - Ентер\n",
"1: Имя", "2: Фамилию", "3: Отчество","4: Год рождения", "5: Группу", "6: Логин", "7: Пароль"};
Menu menu = new Menu(items);
int menuResult;
menuResult = menu.PrintMenu();
switch (menuResult)
{
case 1:
//s.SetName();
Console.WriteLine("Введите новое имя:");
n = Console.ReadLine();
students.Add(new Student
{
Id = s.Id,
Surname = s.Surname,
Name = n,
Middlename = s.Middlename,
Year_of_Birth = s.Year_of_Birth,
Age = s.Age,
Group = s.Group,
Login = s.Login,
Password = s.Password
});
s.SaveStudents(students);
break;
case 2:
Console.WriteLine("Введите новую фамилию:");
string surname = Console.ReadLine();
students.Add(new Student
{
Id = s.Id,
Surname = surname,
Name = s.Name,
Middlename = s.Middlename,
Year_of_Birth = s.Year_of_Birth,
Age = s.Age,
Group = s.Group,
Login = s.Login,
Password = s.Password
});
s.SaveStudents(students);
break;
case 3:
Console.WriteLine("Введите новое отчетсво:");
string middlename = Console.ReadLine();
students.Add(new Student
{
Id = s.Id,
Surname = s.Surname,
Name = s.Name,
Middlename = middlename,
Year_of_Birth = s.Year_of_Birth,
Age = s.Age,
Group = s.Group,
Login = s.Login,
Password = s.Password
});
s.SaveStudents(students);
break;
case 4:
Console.WriteLine("Введите новый год рождения:");
string temp = Console.ReadLine();
int year = Int32.Parse(temp);
students.Add(new Student
{
Id = s.Id,
Surname = s.Surname,
Name = s.Name,
Middlename = s.Middlename,
Year_of_Birth = year,
Age = s.Age,
Group = s.Group,
Login = s.Login,
Password = s.Password
});
s.SaveStudents(students);
break;
case 5:
Console.WriteLine("Введите новую группу:");
string group = Console.ReadLine();
students.Add(new Student
{
Id = s.Id,
Surname = s.Surname,
Name = s.Name,
Middlename = s.Middlename,
Year_of_Birth = s.Year_of_Birth,
Age = s.Age,
Group = group,
Login = s.Login,
Password = s.Password
});
s.SaveStudents(students);
break;
case 6:
Console.WriteLine("Введите новый логин:");
string login = Console.ReadLine();
students.Add(new Student
{
Id = s.Id,
Surname = s.Surname,
Name = s.Name,
Middlename = s.Middlename,
Year_of_Birth = s.Year_of_Birth,
Age = s.Age,
Group = s.Group,
Login = login,
Password = s.Password
});
s.SaveStudents(students);
break;
case 7:
Console.WriteLine("Введите новый пароль:");
string pass = Console.ReadLine();
students.Add(new Student
{
Id = s.Id,
Surname = s.Surname,
Name = s.Name,
Middlename = s.Middlename,
Year_of_Birth = s.Year_of_Birth,
Age = s.Age,
Group = s.Group,
Login = s.Login,
Password = pass
});
s.SaveStudents(students);
break;
}
Console.WriteLine("Для продолжения нажмите любую клавишу");
Console.ReadKey();
}