3

我正在制作一个函数,它将从 StreamReader 中获取行数,不包括注释(以“//”开头的行)和新行。

这是我的代码:

private int GetPatchCount(StreamReader reader)
    {
        int count = 0;

            while (reader.Peek() >= 0)
            {
                string line = reader.ReadLine();
                if (!String.IsNullOrEmpty(line))
                {
                    if ((line.Length > 1) && (!line.StartsWith("//")))
                    {
                        count++;
                    }
                }
            }

        return count;
    }

我的 StreamReader 的数据是:

// Test comment

但我收到一个错误,“对象引用未设置为对象的实例。” 有没有办法解决这个错误?

编辑 原来当我的 StreamReader 为空时会发生这种情况。因此,使用 musefan 和史密斯先生建议的代码,我想出了这个:

private int GetPatchCount(StreamReader reader, int CurrentVersion)
    {
        int count = 0;
            if (reader != null)
            {
            string line;
            while ((line = reader.ReadLine()) != null)
                if (!String.IsNullOrEmpty(line) && !line.StartsWith("//"))
                    count++;
            }
        return count;
    }

谢谢您的帮助!

4

4 回答 4

2

没有必要Peek(),这实际上也可能是问题所在。你可以这样做:

string line = reader.ReadLine();
while (line != null)
{
    if (!String.IsNullOrEmpty(line) && !line.StartsWith("//"))
    {
        count++;
    }
    line = reader.ReadLine();
}

当然,如果您StreamReader为空,那么您就有问题了,但是仅凭示例代码不足以确定这一点-您需要对其进行调试。应该有大量的调试信息让您确定哪个对象实际上是空的

于 2013-04-22T15:17:24.480 回答
1

听起来你的reader对象是null

您可以通过执行以下操作检查阅读器是否为空:

if (reader == null) {
   reader = new StreamReader("C:\\FilePath\\File.txt");
} 
于 2013-04-22T15:16:49.840 回答
1

musefan 建议代码的稍微整洁的变体;只是一个 ReadLine() 代码。+1 建议删除长度检查 btw。

private int GetPatchCount(StreamReader reader)
{
    int count = 0;
    string line;
    while ((line = reader.ReadLine()) != null)
        if (!String.IsNullOrEmpty(line) && !line.StartsWith("//"))
            count++;
    return count;
}
于 2013-04-22T15:26:46.090 回答
0

您的代码没有足够的信息来解决您的问题。根据我的假设,我使用 VS 2010 制作了一个小型应用程序,它运行良好。我相信您的代码与 streamReader 有问题。如果 streamReader 为空,您的代码将抛出“未将对象引用设置为对象的实例。” 您应该检查 streamReader 不为空并确保 streamReader 可用。

You can reference code below. With make sure the TextFile1.txt existing at D:\ Hope this help.

namespace ConsoleApplication1
{
using System;
using System.IO;

class Program
{
    static void Main(string[] args)
    {
        using (StreamReader streamReader = new StreamReader(@"D:\\TextFile1.txt"))
        {
            int count = GetPatchCount(streamReader);
            Console.WriteLine("NUmber of // : {0}",  count);
        }

        Console.ReadLine();
    }

    private static int GetPatchCount(StreamReader reader)
    {
        int count = 0;

        while (reader.Peek() >= 0)
        {
            string line = reader.ReadLine();
            if (!String.IsNullOrEmpty(line))
            {
                if ((line.Length > 1) && (!line.StartsWith("//")))
                {
                    count++;
                }
            }
        }

        return count;
    }
}
}
于 2013-04-22T15:34:05.557 回答