繁体   English   中英

C#StreamReader无法读取行

[英]C# StreamReader failing to read lines

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

尝试使用您的文件,并且代码在第二个循环而不是第一个循环中失败。
这是因为末尾的“空白行”触发了第二个循环,但此时没有更多数据可读取。

如果您确定每个“记录”都用空行分隔,则可以在循环末尾添加另一个读取

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

编辑:从埃里克看到答案–为每个循环添加了新帐户的正确初始化

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

另一种方法是:

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);
         }

如果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));

如果您包含有效数据,则您的代码可能会在以下情况上引发异常:

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>();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM