【问题标题】:Irregular characters added to beginning of file不规则字符添加到文件开头
【发布时间】:2014-01-10 16:29:14
【问题描述】:

我正在关注 Microsoft 关于创建和写入简单文件的教程,但我得到了意想不到的结果。

http://msdn.microsoft.com/en-us/library/36b93480%28v=vs.110%29.aspx

我实际上不是将一系列数字写入文件,而是将 XML 文本写入文件。但它在一开始就加了“Ł”,我不知道为什么。

代码如下:

    public static void CreateFile(string xml)
    {
        var dateStamp = DateTime.Now.ToString("yyyy-MM-dd");
        var fileName = "file_" + dateStamp + ".xml";
        if (File.Exists(fileName))
        {
            Console.WriteLine("File already exists.");
            return;
        }

        using (FileStream fileStream = new FileStream(fileName, FileMode.CreateNew))
        {
            using (BinaryWriter writer = new BinaryWriter(fileStream))
            {
                writer.Write(xml);
            }
        }
    }

【问题讨论】:

  • 为什么要使用 BinaryWriter?
  • 这就是教程中的内容。将其更改为 StreamWriter 修复了它。谢谢!把它放在下面的答案中,我会检查它。

标签: c#


【解决方案1】:

当您阅读BinaryWriter.Write(string) 的手册时,会看到:

向该流写入一个以长度为前缀的字符串……

所以“不合适”的字符实际上是字符串的长度。

您应该改用基于TextWriter 的编写器(例如StreamWriter),或任何其他可用的方法来输出文本文件。

另外,您应该注意文本的编码具体来说,当您尝试输出 XML 时,如果您使用 .NET 的 XML 操作方式构建它,并将其写入 string,那么 <?xml?> 指令可能会引用到utf-16 编码。这是因为 .NET 的字符串使用两字节字符。因此,在处理 XML 时,最好使用 .NET 的 native 方法将 XML 序列化为文本输出(参见例如XmlWriter)。只有这样,编码才能在<?xml?> 指令中正确指定。

【讨论】:

    【解决方案2】:

    那是因为您使用BinaryWriter 将数据写入文件。它将以稍后可以读取的方式写入字符串,因此它会先将字符串长度写入文件,然后再写入字符串数据。

    只需将文件写入文本文件即可。您可以使用StreamWriter,或者简单地使用File 类中的静态辅助方法之一,为您打开、写入和关闭文件:

    File.WriteAllText(fileName, xml);
    

    【讨论】:

      【解决方案3】:

      如果您使用BinaryWriter,就会发生这种情况。如果您将其更改为 StreamWriter,此问题就会消失。

      【讨论】:

        【解决方案4】:

        这是因为BinaryWriter前面加上了写入字符串的长度(作为int)。

          public static void CreateFile(string xml)
            {
                var dateStamp = DateTime.Now.ToString("yyyy-MM-dd");
                var fileName = "file_" + dateStamp + ".xml";
                if (File.Exists(fileName))
                {
                    Console.WriteLine("File already exists.");
                    return;
                }
        
                using (FileStream fileStream = new FileStream(fileName, FileMode.CreateNew))
                {
                    using (StreamWriter writer = new StreamWriter(fileStream))
                    {
                        writer.Write(xml);
                    }
                }
            }
        

        【讨论】:

          猜你喜欢
          • 2021-11-14
          • 2017-02-27
          • 2011-08-30
          • 2017-02-07
          • 1970-01-01
          • 1970-01-01
          • 2019-09-19
          • 1970-01-01
          • 2016-09-27
          相关资源
          最近更新 更多