C# Как правильно считать данные в массив с файла через StreamReader? По заданию, есть базовый класс Human, который имеет в себе переменные Name, LastName, Age и 3 наследующих класса Student, Teacher, TaxiDriver, у которых также свои параметры. Нужно считывая из одного .txt файла данные заполнить 3 объекта ученика, учителя, и водителя, имея следующую структуру файла:Student SOne { “Name”: “Андрей”, “LastName”: “Егоров”, “studentId”: “123456” “Age”: “20”}; Teacher TOne { “Name”: “Иван”, “LastName”: “Корчистый”, “Subject”: “ООП”, “Age”: “32”}; TaxiDriver DOne { “Name”: “Александр”, “LastName”: “Серый”, “TaxiName”: “777”, “Age”: “40”}; Где первое значение (Name, LastName, Age и т.д.) это название переменной, а второе значение - это сами данные. По заданию необходимо использовать StreamReader, и заполнить каждый объект массивом данных (именно массив, не список) но не могу понять как считать с файла данные и заполнить 3 разных объекта разных классов, да еще и такой структуры, помогите пожалуйста.
Для считывания данных из файла и заполнения объектов с помощью StreamReader вам необходимо создать метод, который будет это делать. Вот пример реализации такого метода:
using System; using System.IO; class Program { static void Main() { string file = "data.txt"; using (StreamReader sr = new StreamReader(file)) { Student student = new Student(); Teacher teacher = new Teacher(); TaxiDriver taxiDriver = new TaxiDriver(); string line; string className = ""; while ((line = sr.ReadLine()) != null) { if (line.Contains("Student") || line.Contains("Teacher") || line.Contains("TaxiDriver")) { className = line; continue; } string[] parts = line.Split(':'); string propertyName = parts[0].Trim(); string propertyValue = parts[1].Trim().Trim(';').Trim('"'); switch (className) { case "Student SOne": FillObject(student, propertyName, propertyValue); break; case "Teacher TOne": FillObject(teacher, propertyName, propertyValue); break; case "TaxiDriver DOne": FillObject(taxiDriver, propertyName, propertyValue); break; } } Console.WriteLine("Student:"); student.PrintInfo(); Console.WriteLine("Teacher:"); teacher.PrintInfo(); Console.WriteLine("TaxiDriver:"); taxiDriver.PrintInfo(); } } static void FillObject(Human human, string propertyName, string propertyValue) { switch (propertyName) { case "Name": human.Name = propertyValue; break; case "LastName": human.LastName = propertyValue; break; case "Age": human.Age = Convert.ToInt32(propertyValue); break; case "studentId": ((Student)human).StudentId = propertyValue; break; case "Subject": ((Teacher)human).Subject = propertyValue; break; case "TaxiName": ((TaxiDriver)human).TaxiName = propertyValue; break; } } } class Human { public string Name { get; set; } public string LastName { get; set; } public int Age { get; set; } public virtual void PrintInfo() { Console.WriteLine($"Name: {Name}"); Console.WriteLine($"LastName: {LastName}"); Console.WriteLine($"Age: {Age}"); } } class Student : Human { public string StudentId { get; set; } public override void PrintInfo() { base.PrintInfo(); Console.WriteLine($"StudentId: {StudentId}"); } } class Teacher : Human { public string Subject { get; set; } public override void PrintInfo() { base.PrintInfo(); Console.WriteLine($"Subject: {Subject}"); } } class TaxiDriver : Human { public string TaxiName { get; set; } public override void PrintInfo() { base.PrintInfo(); Console.WriteLine($"TaxiName: {TaxiName}"); } }
В данном примере, метод FillObject заполняет объект (student, teacher или taxiDriver) соответствующими значениями из файла. После считывания и заполнения данных, происходит вывод информации об объектах на консоль.
Для считывания данных из файла и заполнения объектов с помощью StreamReader вам необходимо создать метод, который будет это делать. Вот пример реализации такого метода:
using System;using System.IO;
class Program
{
static void Main()
{
string file = "data.txt";
using (StreamReader sr = new StreamReader(file))
{
Student student = new Student();
Teacher teacher = new Teacher();
TaxiDriver taxiDriver = new TaxiDriver();
string line;
string className = "";
while ((line = sr.ReadLine()) != null)
{
if (line.Contains("Student") || line.Contains("Teacher") || line.Contains("TaxiDriver"))
{
className = line;
continue;
}
string[] parts = line.Split(':');
string propertyName = parts[0].Trim();
string propertyValue = parts[1].Trim().Trim(';').Trim('"');
switch (className)
{
case "Student SOne":
FillObject(student, propertyName, propertyValue);
break;
case "Teacher TOne":
FillObject(teacher, propertyName, propertyValue);
break;
case "TaxiDriver DOne":
FillObject(taxiDriver, propertyName, propertyValue);
break;
}
}
Console.WriteLine("Student:");
student.PrintInfo();
Console.WriteLine("Teacher:");
teacher.PrintInfo();
Console.WriteLine("TaxiDriver:");
taxiDriver.PrintInfo();
}
}
static void FillObject(Human human, string propertyName, string propertyValue)
{
switch (propertyName)
{
case "Name":
human.Name = propertyValue;
break;
case "LastName":
human.LastName = propertyValue;
break;
case "Age":
human.Age = Convert.ToInt32(propertyValue);
break;
case "studentId":
((Student)human).StudentId = propertyValue;
break;
case "Subject":
((Teacher)human).Subject = propertyValue;
break;
case "TaxiName":
((TaxiDriver)human).TaxiName = propertyValue;
break;
}
}
}
class Human
{
public string Name { get; set; }
public string LastName { get; set; }
public int Age { get; set; }
public virtual void PrintInfo()
{
Console.WriteLine($"Name: {Name}");
Console.WriteLine($"LastName: {LastName}");
Console.WriteLine($"Age: {Age}");
}
}
class Student : Human
{
public string StudentId { get; set; }
public override void PrintInfo()
{
base.PrintInfo();
Console.WriteLine($"StudentId: {StudentId}");
}
}
class Teacher : Human
{
public string Subject { get; set; }
public override void PrintInfo()
{
base.PrintInfo();
Console.WriteLine($"Subject: {Subject}");
}
}
class TaxiDriver : Human
{
public string TaxiName { get; set; }
public override void PrintInfo()
{
base.PrintInfo();
Console.WriteLine($"TaxiName: {TaxiName}");
}
}
В данном примере, метод FillObject заполняет объект (student, teacher или taxiDriver) соответствующими значениями из файла. После считывания и заполнения данных, происходит вывод информации об объектах на консоль.