0

我有个问题。

这是代码:

StreamReader lasa = new StreamReader("klubbar.txt");
while (true)
{
    string line = lasa.ReadLine();

    if (line == null)
    {
        break;
    }
    antal++;
    Console.WriteLine(line);

}
lasa.Close();  

这些代码行导致我将变量写入文本文件时出现问题:

StreamWriter sparaklubb = new StreamWriter("klubbar.txt");

for (int i = 1; i <= antal; i++)
{
    sparaklubb.Write(klubbar[i].id + "\t");
    sparaklubb.Write(klubbar[i].klubbnamn + "\t");
    sparaklubb.Write(klubbar[i].vip + "\t");
    sparaklubb.Write(klubbar[i].dansgolv + "\t");
    sparaklubb.Write(klubbar[i].intrade + "\t");
    sparaklubb.Write(klubbar[i].casino + "\t");
    sparaklubb.WriteLine(klubbar[i].genre);
}
sparaklubb.Close();

因为我收到此错误:

在此处输入图像描述

如果我删除 StreamReader 代码一切正常,我不知道如何修复它。

4

2 回答 2

0

基于快速查看您的代码,您永远不会填充数组,因为数组中的每个实体都是空的,所以当您尝试访问对象上的字段时,对象本身是空的。

因此该对象未设置异常。

您需要从流阅读器部分的文本文件中正确实现填充

        klubb[] klubbar = new klubb[100]; //Skapa en vektor där varje element kan behålla flera olika variblar från klassen "klubb"

        //IF YOU REMOVE THIS STREAMREADERCODE WITH THE WHILE LOOP EVERYTHING WILL WORK FINE
        StreamReader lasa = new StreamReader("klubbar.txt");
        while (true)
        {
            string line = lasa.ReadLine();

            if (line == null)
            {
                break;
            }
            antal++;
            Console.WriteLine(line);
           // klubbar[antal] = line;     //ADD EACH LINE IN TEXTFILE TO AN SEPAREATE INDEX IN ARRAY klubar
        }
        lasa.Close();

当您阅读每一行时,您需要将该行解析为您的 Klubb 对象。这应该足够简单,因为它看起来像您的文件是制表符分隔的。

1       Harrys  True    6   100 blackjack   klubbfan
2        xoY    True    6   100 blackajacka klubb
3       lounge  True    6   100 blackjacka  klubb

作为对评论的回应,因此您可以执行以下操作:

klubbar[antal] = GetKlubbFromString(line); 
^ this line is to replace the line in your stream reader section

private static klubb GetKlubbFromString(string line)
    {
        string[] lineItems = line.Split('\t');

        //1       Harrys  True    6   100 blackjack   klubbfan


        return new klubb
                   {
                       id = Convert.ToInt32(lineItems[0]),
                       klubbnamn = lineItems[1],
                       vip = Convert.ToBoolean(lineItems[2]),
                       dansgolv = Convert.ToInt32(lineItems[3]),
                       intrade = Convert.ToInt32(lineItems[4]),
                       casino = lineItems[5],
                       genre = lineItems[6]
                   };
    }

由于例外情况,我个人不会使用 Convert.To,我更喜欢 TryParse,而且我相信一些更聪明的 SO 成员会出现并提供更好的方法来做到这一点。

于 2013-03-12T10:58:40.343 回答
0

问题是您没有antal在阅读器代码之后重置为 0。这会导致插入klubbar数组的代码从当前值开始antal,例如,阅读器可能读入 5 行,所以antal是 5。这意味着您没有将对象放入klubbar数组中的位置 1- 4(你真的应该从 0 开始索引)。然后在您的编写器代码中,您尝试在null值上引用成员klubbar[1]。删除阅读器代码“修复”了问题,因为antal当您开始将对象放入klubbar数组时将为 0。我的建议是使用 aList<klubb>而不是数组。

于 2013-03-12T10:52:49.700 回答