1

プログラムを作成したので、データを保存したいです。保存はできますが、「読み込み」ができません。

    public void Save(StreamWriter sw)
    {
        for (int i = 0; i < buecher.Count; i++)
        {
            Buch b = (Buch)buecher[i];
            if (i == 0)
                sw.WriteLine("ISDN ; Autor ; Titel");
            sw.WriteLine(b.ISDN + ";" + b.Autor + ";" + b.Titel);
        }
    }

    public void Load(StreamReader sr)
    {
        int isd;
        string aut;
        string tit;

        while (sr.ReadLine() != "")
        {
            string[] teile = sr.ReadLine().Split(';');
            try
            {
                isd = Convert.ToInt32(teile[0]);
                aut = teile[1];
                tit = teile[2];
            }
            catch
            {
                throw new Exception("umwandlung fehlgeschlagen");

            }
            Buch b = new Buch(isd, aut, tit);
            buecher.Add(b);

        }

    }

休憩を入れてそれをやっていると、buecher.Add(b);すべてがうまくいきますが、明らかに1冊しか表示されません...休憩を使用していない場合、彼は「nullreference ..」というエラーを出します

ラモンをよろしくお願いします。

4

3 に答える 3

2

問題は、ループ内の反復ごとに 2 行を読み取っている (そして最初の行を破棄している) ことです。ファイルの行数が奇数の場合、 の 2 回目の呼び出しはReadを返しnullます。

行を条件の変数に読み取り、その変数をループで使用します。

public void Load(StreamReader sr) {
  int isd;
  string aut;
  string tit;

  // skip header
  sr.ReadLine();

  string line;
  while ((line = sr.ReadLine()) != null) {
    if (line.Length > 0) {
      string[] teile = line.Split(';');
      try {
        isd = Convert.ToInt32(teile[0]);
        aut = teile[1];
        tit = teile[2];
      } catch {
        throw new Exception("umwandlung fehlgeschlagen");
      }
      Buch b = new Buch(isd, aut, tit);
      buecher.Add(b);
    }
  }
}
于 2013-09-06T23:55:32.473 に答える
0

sr.ReadLine()すべての回線で 2 回呼び出してwhile()います。ファイルの最後に到達しているため、null.

于 2013-09-06T23:53:11.183 に答える
0

これに対するアプローチは異なりますが、より簡単なのでお勧めします。

 Load(string filepath)
 {
     try
     {
         List<Buch> buches = File.ReadAllLines(filepath)
                             .Select(x => new Buch(int.Parse(x.Split(';')[0]), x.Split(';')[1], x.Split(';')[2]));
     {
     catch
     {
         throw new Exception("umwandlung fehlgeschlagen");
     }

 }

より読みやすい場合は、より多くの行で実行できますが、私はファイルの読み取りを好みFile.ReadAllText、アプローチFile.ReadAllLinesするようになりました。StreamReader

LINQ ステートメントを使用する代わりに、次のこともできます。

 Load(string filepath)
 {
     try
     {
         string[] lines = File.ReadAllLines(filepath);
         foreach (string line in lines)
         {
             string[] tokens = line.Split(';');
             if (tokens.Length != 3)
                // error
             int isd;
             if (!int.TryParse(tokens[0], out isd))
                //error, wasn't an int
             buetcher.Add(new Buch(isd, tokens[1], tokens[2]);
         }

     {
     catch
     {
         throw new Exception("umwandlung fehlgeschlagen");
     }

 }
于 2013-09-07T00:02:37.580 に答える