2011-08-14 73 views
2

的數組,我有以下結構:從順序文件讀入結構

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 

什麼是從文件中讀取數據,並將其加載到結構的數組的最佳方式?

+1

是字符串是固定大小還是變量? – BrokenGlass

+0

@BrokenGlass:變量,因爲名字和姓氏的長度會有所不同 – n1te

回答

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#瞭解到關於需要在struct覆蓋ToString(),下面可能幫助打印值來解決此問題:

在StudentDetails結構(摘自尼克布拉德利的回答):

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(); 
} 
+0

該代碼有效,但studentArray不會打印除CA4.Program.StudentDetails之外的任何內容,任何想法? – n1te

+0

根據你以前的問題,它看起來像你需要重寫你的結構中的'ToString()'方法。你可以發佈沒有正確執行的代碼嗎?看到我編輯的答案。 – Tim

+0

我已通過電子郵件發送給您。 – n1te

1

最初我會用某種Serialization來寫入文件,因爲它也會照顧閱讀部分。
但考慮到你所創建的文件的方式,I'de使用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(); 
+0

while循環中的'(line = reader.ReadLine())!= null'條件會拋出該行, t在while循環中做任何事情。 – Tim

+0

@Tim - 修好了,謝謝! – sternr