1

銀行業務プログラムを作成しています。アカウントのテキスト ファイルを読み取ってリストに追加できるようにしたいと考えています。私の問題は、1行しか読み取らず、その後、行がnullであるというエラーが表示されることですが、2番目のようなものは年齢でなければならないため、そうではありません。

リストにデータを追加するアカウントを継続的に通過させたいのですが、各アカウントは空白行で区切られています。

コード:

 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

ファイルで試してみると、コードは最初のループではなく 2 番目のループで失敗します。
これは、最後の「空白行」によって 2 番目のループがトリガーされますが、読み取るデータがなくなるためです。

すべての「レコード」が空白行で区切られていることが確実な場合は、ループの最後に別の読み取りを追加するだけです

    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 ループが正しく終了します.....

編集:エリックからの回答を見てください - すべてのループに新しいアカウントの正しい初期化を追加しました

于 2012-11-15T14:02:13.597 に答える
4

まあ、私が直接見ることができる唯一の本当のエラーは、アカウントの新しいインスタンスを作成していないということです.保存されたファイルの最後のアカウントまで。ループの反復ごとに新しいアカウントを作成する必要があります。

于 2012-11-15T14:02:31.533 に答える
0

に有効なデータが含まれている場合、コードはおそらく次の場合に例外をスローします。

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

ある種の住所クラスがあるようです。アカウントコンストラクターまたはループでこのプロパティをインスタンス化する必要があります。

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 に答える