1

我正在创建一个银行程序,我希望能够读取我的帐户文本文件并将它们添加到列表中。我的问题是,它只读取 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);

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

4

5 回答 5

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 循环将正确退出.....

编辑:看到 Eric 的答案——为每个循环添加了新帐户的正确初始化

于 2012-11-15T14:02:13.597 回答
4

好吧,我可以立即看到的唯一真正错误是您没有创建 Account 的新实例-因此您要做的是更改单个帐户上的值并将其读取到列表中-您只会结束与存储的文件中的最后一个帐户一致。您需要为循环的每次迭代创建一个新帐户。

于 2012-11-15T14:02:31.533 回答
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>();
于 2012-11-15T14:12:17.877 回答
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);
         }
于 2012-11-15T14:09:39.800 回答
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));
于 2012-11-15T14:10:07.760 回答