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);一切都很好,但它显然只向我展示了一本书......如果我不使用休息,他会给我一个错误“nullreference..”

如果有人能帮助我向拉蒙致以最诚挚的问候,那就太棒了

4

3 回答 3

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()为每行调用两次,一次在 the 中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.ReadAllTextFile.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 回答