从顺序文件读取到结构数组

时间:2011-08-14 05:12:22

标签: c# arrays file struct

我有以下结构:

    public struct StudentDetails
    {
        public string unitCode; //eg CSC10208
        public string unitNumber; //unique identifier
        public string firstName; //first name
        public string lastName;// last or family name
        public int studentMark; //student mark
    }

使用该结构我将数据写入顺序文件。文件中的数据如下:

ABC123
1
John
Doe
95
DCE433
3
Sherlock
Holmes
100
ASD768
5
Chuck
Norris
101

从该文件读取数据并将其加载到结构数组中的最佳方法是什么?

2 个答案:

答案 0 :(得分:1)

最初我会使用某种Serialization来写入文件,因为它也会照顾阅读部分。
但是考虑到你创建文件的方式,我使用StreamReader和它的ReadLine()方法 - 因为你知道你写入服务器的属性的顺序很简单:

string line = "";
while ((line = reader.ReadLine()) != null)
{
  YourStruct t = new YourStruct();
  t.unitCode = line;
  t.unitNumber = reader.ReadLine();
  ...
  resultArray.Add(t);
}
reader.Close(); reader.Dispose();

答案 1 :(得分:1)

假设您的文件每行一个值:

List<StudentDetails> studentList = new List<StudentDetails>();

using (StreamReader sr = new StreamReader(@"filename"))
{

    while (!sr.EndOfStream)
    {
        StudentDetails student;

        student.unitCode = sr.ReadLine();
        student.unitNumber = sr.ReadLine();
        student.firstName = sr.ReadLine();
        student.lastName = sr.ReadLine();
        student.studentMark = Convert.ToInt32(sr.ReadLine());

        studentList.Add(student);
    }

    StudentDetail[] studentArray = studentList.ToArray();

}

请注意,这不是很强大 - 如果每个学生没有5行,你会遇到问题,或者如果最后一个学生少于5行。

修改

从上一个问题Array of structs in C#中汲取经验教训,了解在ToString()中覆盖struct的必要性,以下内容可能有助于解决打印值的问题:

在StudentDetails结构中(取自Nick Bradley的回答):

public override string ToString()
{
    return string.Format("{0}, {1}, {2}, {3}, {4}", unitCode,
           unitNumber, firstName, lastName, studentMark);
}

然后你可以简单地遍历数组:

for (int i = 0; i < studentArray.Length; i++)
{
    Console.WriteLine("Student #{0}:", i);
    Console.WriteLine(studentArray[i]);
    Console.WriteLine();
}