【问题标题】:Write/WriteLine strange behaviourWrite/WriteLine 奇怪的行为
【发布时间】:2018-01-08 10:50:01
【问题描述】:

我有一个类似 ini 的文件结构,我想从中读取:

[section1]
param1=value1
param2=value2
etc...

这里是代码:

string inputLine;
// Read and display lines from the file until the end of 
// the file is reached.
while ((inputLine = sr.ReadLine()) != null)
{
    Console.WriteLine(inputLine);
    {
        string[] values = inputLine.Split(new Char[] { '=' });
        Console.WriteLine(values[0]);
        Console.WriteLine(values[1]);
    }
}

我的问题是,如果我删除所有[section] 部分,我可以很好地读取所有参数。但如果我决定保留它们,Console.Write(inputLine)Console.Write 就会失败。我还尝试了Console.Write(inputLine[0]),它也给了我一个错误,这让我认为[ 字符在某种程度上是问题......

Write/WriteLine 只是一个测试机制,最后我真正想要的是char.IsLetter(inputStream[0]) 来检查该行的第一个字符是否是字母,如果是,请跳过它,因为我只是感兴趣在读取参数的键值对时。

【问题讨论】:

    标签: c# file stream


    【解决方案1】:

    问题是当链接[section]= 拆分时,您正试图读取数组values 中的第二项,导致单项数组。你可以跳过所有以[ 开头的行来解决这个问题:

    string inputLine;
    // Read and display lines from the file until the end of 
    // the file is reached.
    while ((inputLine = sr.ReadLine()) != null)
    {
        if (String.IsNullOrEmpty(inputLine) || inputLine.StartsWith("[")) {
            continue;
        }
    
        Console.WriteLine(inputLine);
        {
            string[] values = inputLine.Split(new Char[] { '=' });
            Console.WriteLine(values[0]);
            Console.WriteLine(values[1]);
        }
    }
    

    【讨论】:

    • 好的,它就像我想要的那样工作,如果我想“继续”或者如果行以“[”开头或者它是空的怎么办?
    • @Bersekz 我已经编辑了帖子以包含一个空或空检查。
    【解决方案2】:

    部分之间有空行吗? 因为那是你会在 inputLine[0] 上得到错误的地方。

    【讨论】:

      【解决方案3】:

      您应该在尝试访问您尝试从中解析的任何值之前验证您读取的行是否有数据,否则您可能会收到像其他 2 个答案所示的错误(因为只有 1 个值被解析或从行中读取 0 个字符)。

      string testInput =
         "[section1]\r\n" +
         "param1=value1\r\n" +
         "param2=value2\r\n\r\n" +
         "[section2]\r\n" +
         "parama=valuea";
      
      using (var reader = new System.IO.StringReader(testInput))
      {
         string inputLine;
         while ((inputLine = reader.ReadLine()) != null)
         {
            string[] values = inputLine.Split(new char[] {'='}, 2);
            if (values.Length > 1)
            {
               Console.WriteLine("Value of {0} is {1}", values[0], values[1]);
            }
            else
               Console.WriteLine("\"{0}\" has {1} characters and {2} values on it", inputLine, inputLine.Length, values.Length);       }
      }
      

      输出是:

      "[section1]" has 10 characters and 1 values on it
      Value of param1 is value1
      Value of param2 is value2
      "" has 0 characters and 1 values on it
      "[section2]" has 10 characters and 1 values on it
      Value of parama is valuea
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-02-04
        • 1970-01-01
        • 2019-05-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多