我正在创建一个银行业务计划,我希望能够阅读我的帐户文本文件并将其添加到列表中。我的问题是,它只读取1行,然后,它会得到一个错误,说该行为空,但不应该是因为第二行应该是年龄。
我希望它能够不断浏览将数据添加到列表中的帐户,每个帐户用空行分隔。
代码:
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);
答案 0 :(得分:4)
尝试使用您的文件,代码在第二个循环中失败,而不是第一个循环。
这是因为最后的“blankline”触发了第二个循环,但是没有更多的数据可供读取。
如果您确定每个“记录”都用空行分隔,那么您可以在循环结束时添加另一个读取
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循环正确退出.....
编辑:看到Eric的答案 - 为每个循环添加了正确的新帐户初始化
答案 1 :(得分:4)
嗯,我唯一可以看到的真正错误是你没有创建一个新的帐户实例 - 所以你要做的就是更改一个帐户的值并将其读入列表 - 你' ll最终只能存储文件中的最后一个帐户。您需要为循环的每次迭代创建一个新帐户。
答案 2 :(得分: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);
}
答案 3 :(得分: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));
答案 4 :(得分:0)
如果您包含有效数据,则代码可能会抛出异常:
NewAccount.Address.Country = FileToRead.ReadLine();
看起来你有某种类的地址。您必须在Account构造函数或循环中实例化此属性:
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>();