Цель: ввести информацию о студентах => записать в файл => вывести из файла(в консоль).
Никаких ошибок не происходит, но работает не совсем так как мне надо. Когда запускается функция вывода записей, в консоль выводится только первая добавленная в файл запись.
Подскажите, что я делаю не так...
Добавление записи в файл:
public static void AddString()
{
Console.Clear();
string path = "info.dat";
bool exit = true;
while (exit)
{
Console.Clear();
Console.WriteLine("\n\tВведите данные студента:");
Console.WriteLine("\nФ.И.О: ");
string name = Console.ReadLine();
Console.WriteLine("\nКурс: ");
int course = Convert.ToInt32(Console.ReadLine());
Console.WriteLine("\nГруппа: ");
string group = Console.ReadLine();
Console.WriteLine("\nНомер зачётки: ");
int id = Convert.ToInt32(Console.ReadLine());
Console.WriteLine("\nСредний балл: ");
float avg = (float)Convert.ToDouble(Console.ReadLine());
Console.Clear();
Student student = new Student(name, course, group, id, avg);
Student[] students = new Student[] { student };
BinaryFormatter formatter = new BinaryFormatter();
using (FileStream stream = new FileStream(path, FileMode.Append))
{
formatter.Serialize(stream, students);
Console.WriteLine("\nУспешно добавлен.");
}
Console.WriteLine("\n\nХотите добавить ещё одного студента?\n\n1)Да\n2)Нет\n");
int choice = Convert.ToInt32(Console.ReadLine());
switch (choice)
{
case 1:
Console.WriteLine("OK.");
break;
case 2:
exit = false;
break;
default:
Console.Clear();
Console.WriteLine("\n\tОшибка ввода!");
Console.WriteLine("\tПопробуйте снова.\n\tНажмите 'Ввод' для продолжения...\n\t");
Console.ReadKey();
break;
}
}
}
Вывод всех записей из файла:
public static void StudentList()
{
string path = "info.dat";
BinaryFormatter formatter = new BinaryFormatter();
using (FileStream stream = new FileStream(path, FileMode.Open))
{
Console.Clear();
Student[] students = (Student[])formatter.Deserialize(stream);
Console.WriteLine("Список студентов:");
foreach (Student student in students)
{
Console.WriteLine($"\nИмя: {student.Name} \nКурс: {student.Course} \nГруппа: {student.Group} \nНомер зачётки: {student.Id} \nСредний балл: {student.AvgMark}");
}
}
Console.ReadKey();
}
Я был не прав, BinaryFormatter поддерживает дописывание(ответ ниже), НО только по одному объекту, а не массивом объектов. Но более предпочтительна иная стратегия, что бы не обращаться каждый раз к файлу данных:
Покажу пример, как можно дописывать записи в файл с помощью BinaryFormatter
и читать их потом в цикле. Отмечу, что прочитать их сразу все как массив будет уже невозможно.
[Serializable]
public class Student
{
public int Id { get; set; }
public string Name { get; set; }
}
var student1 = new Student { Id = 1, Name = "one" };
var student2 = new Student { Id = 2, Name = "two" };
var bf = new BinaryFormatter();
// Пишем в новый файл
using (var fileStream = new FileStream("test.bin", FileMode.Create))
bf.Serialize(fileStream, student1);
// Дописываем
using (var fileStream = new FileStream("test.bin", FileMode.Append))
bf.Serialize(fileStream, student2);
// Читаем записи по одной в цикле
using (var fileStream = new FileStream("test.bin", FileMode.Open))
{
while (fileStream.Position < fileStream.Length)
{
var student = (Student)bf.Deserialize(fileStream);
Console.WriteLine(student.Id + " " + student.Name);
}
}
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Есть кнопки категорий, которые выводятся циклом foreach и соответственно таких кнопок несколько:
На странице есть какие-то статические поля и динамически добавляется таблица с инпутами к примеру такая:
Почему после выполнения строки startTimesetHours(0,0,0); обнуляются значения у currentTime?