2012-11-15 180 views
1

我正在創建一個銀行程序,我希望能夠讀取我的帳戶文本文件並將它們添加到列表中。我的問題是,它只讀取1行,之後,它會得到一個錯誤,說該行爲空,但它不應該是因爲第二個應該是年齡。C#StreamReader無法讀取行

我希望它不斷地通過帳戶添加數據到列表中,每個帳戶由一個空行分隔。

代碼:

StreamReader FileToRead = new StreamReader(@"C:\Users\...\Accounts.txt"); 
     Account NewAccount = new Account(); 

     string line; 

     do 
     { 
      NewAccount.Name = FileToRead.ReadLine(); 
      NewAccount.Age = int.Parse(FileToRead.ReadLine()); 
      NewAccount.Balance = int.Parse(FileToRead.ReadLine()); 
      NewAccount.Address.Country = FileToRead.ReadLine(); 
      NewAccount.Address.City = FileToRead.ReadLine(); 
      NewAccount.Address.FirstLine = FileToRead.ReadLine(); 
      NewAccount.Address.SecondLine = FileToRead.ReadLine(); 
      NewAccount.Address.PostCode = FileToRead.ReadLine(); 
      NewAccount.AccountNumber = int.Parse(FileToRead.ReadLine()); 
      Accounts.Add(NewAccount); 
     } while ((line = FileToRead.ReadLine()) != null); 

文本文件:http://pastebin.com/raw.php?i=1r9TEUPx

+1

通過線的程序行步驟,並確定第一點你的期望偏離現實。 – usr

+2

NewAccount.Name最終是什麼? – CodingGorilla

+1

它正在閱讀的第一行是什麼?這是全部文字嗎?在這種情況下,它可能是Windows'\ r \ n'換行符和Unix'\ n'換行符的混合。 –

回答

4

試着與你的文件和代碼失敗在第二循環不是第一個。
這是因爲末尾的「空行」會觸發第二個循環,但是不會再有數據要讀取。

如果您是確保每一個「記錄」是由空行分隔,那麼你可以簡單地在循環

do 
    { 
     NewAccount = new Account(); 

     NewAccount.Name = FileToRead.ReadLine(); 
     NewAccount.Age = int.Parse(FileToRead.ReadLine()); 
     NewAccount.Balance = int.Parse(FileToRead.ReadLine()); 
     NewAccount.Address.Country = FileToRead.ReadLine(); 
     NewAccount.Address.City = FileToRead.ReadLine(); 
     NewAccount.Address.FirstLine = FileToRead.ReadLine(); 
     NewAccount.Address.SecondLine = FileToRead.ReadLine(); 
     NewAccount.Address.PostCode = FileToRead.ReadLine(); 
     NewAccount.AccountNumber = int.Parse(FileToRead.ReadLine()); 

     FileToRead.ReadLine(); // here to absorb the empty line between 'records' 

     Accounts.Add(NewAccount); 
    } while ((line = FileToRead.ReadLine()) != null); 

現在的末尾添加另一個讀,當你到達檔案結尾的while循環退出正確.....

編輯:看到埃裏克答案 - 增加了一個新的帳戶的正確初始化每次循環

4

好,唯一真正的錯誤,我可以看到副手是你不是創建一個新的帳戶實例 - 所以您將要做的是更改單個帳戶的值並將其讀取到列表中 - 最終只會保存文件中的最後一個帳戶。您需要爲循環的每次迭代創建一個新帳戶。

+0

好點 - 雖然這不會引起例外,但絕對需要修正 –

0

另一種方式來做到這一點:

string[] lines = System.IO.File.ReadAllLines(@"C:\Users\...\Accounts.txt"); 

     if (lines != null && lines.Length > 0) 
     { 
     Account NewAccount = new Account(); 
     NewAccount.Name = lines[0].ToString(); 
     NewAccount.Age = lines[1].ToString(); 
     NewAccount.Balance = lines[2].ToString(); 
     NewAccount.Address.Country = lines[3].ToString(); 
     NewAccount.Address.City = lines[4].ToString(); 
     NewAccount.Address.FirstLine = lines[5].ToString(); 
     NewAccount.Address.SecondLine = lines[6].ToString(); 
     NewAccount.Address.PostCode = lines[7].ToString(); 
     NewAccount.AccountNumber = lines[8].ToString(); 
     Accounts.Add(NewAccount); 
     } 
0

如果你有這樣的問題,通過StreamReader,考慮使用File.ReadAllLines代替:

var lines = File.ReadAllLines(path); 
var NewAccount = new Account(); 
NewAccount.Name = lines.First(); 
NewAccount.Age = int.Parse(lines.ElementAt(1)); 
NewAccount.Balance = int.Parse(lines.ElementAt(2)); 
NewAccount.Address.Country = lines.ElementAt(3); 
NewAccount.Address.City = lines.ElementAt(4); 
NewAccount.Address.FirstLine = lines.ElementAt(5); 
NewAccount.Address.SecondLine = lines.ElementAt(6); 
NewAccount.Address.PostCode = lines.ElementAt(7); 
NewAccount.AccountNumber = int.Parse(lines.ElementAt(8)); 
0

如果包含有效數據的代​​碼可能就拋出異常:

NewAccount.Address.Country = FileToRead.ReadLine(); 

它看起來像你有某種課fo r地址。你必須在賬戶構造函數或循環實例化這個屬性:

do 
     { 
      ... 
      NewAccount.Balance = int.Parse(FileToRead.ReadLine()); 
      NewAccount.Address = new Account.AddressClass(); 
      NewAccount.Address.Country = FileToRead.ReadLine(); 
      ... 
     } while ((line = FileToRead.ReadLine()) != null); 

我還以爲你先前已實例其他變量,如

Account NewAccount = new Account(); 
List<Account> Accounts = new List<Account>();