C#StreamReader无法读取行

时间:2012-11-15 13:55:17

标签: c# file text streamreader 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

5 个答案:

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