【问题标题】:After adding StreamReader code, can't add variables to my text file StreamWriter添加 StreamReader 代码后,无法将变量添加到我的文本文件 StreamWriter
【发布时间】:2013-03-12 10:27:16
【问题描述】:

我有问题。

这是代码:

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 代码一切正常。

【问题讨论】:

  • 请将完整的错误详细信息以文本形式发布(而不是图片。谷歌搜索不好)。
  • 您是否检查过klubbar 是否包含有效的对象引用?
  • 你在哪里把行放到 klubbar[] 中?为什么你的 klubbar[] 索引从 1 而不是 0 开始?
  • 很高兴知道异常发生在哪一行。
  • int i = 1; i &lt;= antal; i++ 是可疑的,但我们不知道 klubbarantal

标签: c# object reference instance


【解决方案1】:

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

【讨论】:

  • 非常感谢您的帮助,但是我该怎么做才能开始填写数组中的索引 0?三天前我刚开始在瑞典上我的 c# 课程,所以我在这方面不是很高,但我尽了最大努力!再次感谢!
【解决方案2】:

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

因此对象未设置异常。

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

        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 成员会出现并提供更好的方法来做到这一点。

【讨论】:

  • 非常感谢您提供结构化且易于理解的答案。我只是想知道如何将文本文件中的每一行放入一个元素中,该元素的索引基于变量“antal”。
  • 您可以通过 line.split() 将 '\t' 传递给 split 方法来拆分行变量,这将为您返回一个字符串数组 string[] 的行部分。然后您可以将其解析为正确的类型。例如int.TryParse(line[0], out Klubb[i].Id) 用于不需要解析的字符串项,可以直接设置对象字段
  • 我在上面的回答中添加了一个例子来说明我的意思
猜你喜欢
  • 2016-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-05
  • 1970-01-01
  • 2013-04-29
相关资源
最近更新 更多