不正常的字符添加到文件的开头

时间:2014-01-10 16:29:15

标签: c#

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

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);
            }
        }
    }

4 个答案:

答案 0 :(得分:4)

当您阅读BinaryWriter.Write(string)的手册时,它会显示:

  

将一个以长度为前缀的字符串写入此流...

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

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

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

答案 1 :(得分:2)

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

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

File.WriteAllText(fileName, xml);

答案 2 :(得分:1)

这是因为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);
            }
        }
    }

答案 3 :(得分:1)

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