2014-09-24 136 views
1

我試圖通過將聯繫人存儲在文本文件中來製作聯繫簿。例如,假設我有兩個名爲first name和surname的字符串,並且在文本文件中我有一個名字,下一行是姓氏。這是目前我有的代碼,但我不知道我在do循環中需要做什麼,如何讀取一行,將其插入字符串xxx,讀取下一行並將其存儲在字符串yyy中?將文本文件讀入數組?

public Contacts[] getAllContacts() 
    { 

     List<Contacts> theContactList = new List<Contacts>(); 

     string file_name = "Contacts.txt"; 
     string textLine = ""; 

     if (System.IO.File.Exists(file_name) == true) 
     { 
      System.IO.StreamReader objReader; 
      objReader = new System.IO.StreamReader(file_name); 


      do 
      { 
       objReader.ReadLine() + "\r\n"; 

      } while (objReader.Peek() != 1); 

     } 
     if (theContactList.Count > 0) 
     { 
      return theContactList.ToArray(); 

     } 
     else 
     { 
      return null; 
     } 


    } 

我還需要能夠存儲多個聯繫人和更多的領域,如地址,電話號碼等在文本文件中。

+0

你能解釋一下「聯繫人」是數據類型的嗎? (在代碼示例中...很難在文本示例中閱讀) – Thomas 2014-09-24 09:47:10

+0

@Thomas對不起,這是另一個包含字段的類,如公共字符串姓氏,公共字符串first_name – CodingNub 2014-09-24 09:50:10

+0

你看過http: //msdn.microsoft.com/en-us/library/ezwyzy7b.aspx? – 2014-09-24 09:52:31

回答

2

根據推定,總是有2行那裏,它們具有相同的順序將下面的代碼可以工作有:

public Contacts[] getAllContacts() 
{ 

    List<Contacts> theContactList = new List<Contacts>(); 

    string file_name = "Contacts.txt"; 
    string textLine = ""; 
    bool firstNameLine = true; 

    if (System.IO.File.Exists(file_name) == true) 
    { 
     System.IO.StreamReader objReader; 
     objReader = new System.IO.StreamReader(file_name); 
     Contact newContact; 

     do 
     { 
      textLine = objReader.ReadLine(); 
      if (firstNameLine) 
      { 
       newContact = new Contact(); 
       newContact.firstName = textLine; 
      } 
      else 
      { 
       newContact.sureName = textLine; 
       theContactList.Add(newContact); 
      } 

      firstNameLine = !firstNameLine; 

     } while (objReader.Peek() != 1); 

    } 
    if (theContactList.Count > 0) 
    { 
     return theContactList.ToArray(); 

    } 
    else 
    { 
     return null; 
    } 


} 

因此,在這種情況下,代碼usese一個布爾變量,它定義該行讀是用於填充哪個字符串。如果它超過2行(超過2個字符串),那麼將需要一個整型變量(它會增加+1,然後在讀取最後一行時重置),而不是if語句。

0

使用這樣的:

string [] file_array = File.ReadAllLines("path"); 

PS:using System.IO; 此功能讀取整個文件,並存儲其線陣列可以編輯陣列線,然後使用

File.WriteAllLines("path",file_array);

把它們放回文件中。

2

使用XML或CSV文件,甚至只是一個文本文件,但在同一行上的每個「聯繫人」並將其解析出來可能會更好。

下面的代碼會做你想要的。

public Contacts[] GetAllContacts() 
    { 
     List<Contacts> contacts = new List<Contacts>(); 
     const string filePath = "Contacts.txt"; 

     if (File.Exists(filePath)) 
     { 
      using (StreamReader sr = new StreamReader(filePath)) 
      { 
       do 
       { 
        Contacts contact = new Contacts(); 
        contact.FirstName = sr.ReadLine(); 
        contact.Surname = sr.ReadLine(); 
        contacts.Add(contact); 

       } while (sr.Peek() != -1); 
      } 
     } 

     return contacts.ToArray(); 
    } 
+0

不得不說,這並不比我的想法複雜(與兩條線總是存在的情況相同),因此+1 – Thomas 2014-09-24 13:04:14

1
while (objReader.Peek() != -1) 
{ 
    theContactList.Add(new Contact() { Firstname = objReader.ReadLine(), SurName = objReader.ReadLine()}); 
} 

使用初始化列表。 (顯然在Contact類成員上做出了假設)

+0

{}在這個組合中做了什麼? (新聯繫人後的{}} – Thomas 2014-09-24 13:05:57

+0

對象初始值設定項列表。(我以前忘了添加屬性名稱。) – ths 2014-09-24 13:22:04

+0

啊,這就是爲什麼它看起來很奇怪。 TNX。很酷的想法 – Thomas 2014-09-24 13:24:46