【问题标题】:Writing Unix style text file in C#用 C# 编写 Unix 风格的文本文件
【发布时间】:2011-12-12 02:36:29
【问题描述】:

我正在尝试使用我的 C# 程序编写一个带有 Unix 样式换行符的文本文件。

由于某种原因,以下代码不起作用:

TextWriter fileTW = ...

fileTW.NewLine = "\n";

fileTW.WriteLine("Hello World!");

这也不行:

TextWriter fileTW = ...

fileTW.Write("Hello World! + \n");

在这两种情况下,'\n' 都被替换为 '\r\n',这是我不想要的!我一直在用十六进制编辑器验证这一点,它显示每一行以 0x0D0A 结尾。

有什么想法吗?

谢谢!

编辑:

对不起大家,虚惊一场!

请允许我解释...

我的 TextWriter 正在写入 MemoryStream,然后使用 SharpZLib 将其添加到 tar 存档中。事实证明,通过使用 WinZIP 提取文本文件,它会将 \n 的每个实例替换为 \r\n。如果我将相同的 tar 存档复制到我的 Ubuntu 机器并在那里解压缩,则只有 \n 存在。奇怪!

对不起,如果我浪费了任何人的时间!谢谢!

【问题讨论】:

  • 您使用 TextWriter 的任何原因?例如,您可以使用 FileSram...
  • 我正在使用 TextWriter 先写入 MemoryStream。
  • 当我尝试将 MemoryStream 写入文件而不是 TextWriter 时,似乎稍后会添加 /r。让我做一点挖掘,我会回复给大家!感谢大家的宝贵时间!

标签: c# newline textwriter


【解决方案1】:

我无法重现此内容。示例代码:

using System;
using System.IO;

class Test
{
    static void Main()
    {
        using (TextWriter fileTW = new StreamWriter("test.txt"))
        {
            fileTW.NewLine = "\n";            
            fileTW.WriteLine("Hello");
        }
    }
}

之后:

c:\users\jon\Test>dir test.txt
 Volume in drive C has no label.
 Volume Serial Number is 4062-9385

 Directory of c:\users\jon\Test

20/10/2011  21:24                 6 test.txt
               1 File(s)              6 bytes

注意大小 - 6 个字节 - “Hello”为 5,“\n”为 一个。如果不设置 NewLine 属性,则为 7(两个代表 "\r\n")。

你能想出一个类似的简短但完整的程序来演示这个问题吗?之后您如何确定您的文件包含“\r\n”?

【讨论】:

  • 谢谢乔恩!您的代码实际上也按我的预期工作。当我尝试将 MemoryStream 写入文件而不是 TextWriter 时,似乎稍后会添加 /r。让我稍微挖掘一下,我会回复大家的!
  • @dan6470:我非常非常怀疑MemoryStream 正在做类似的事情。你能告诉我们更多关于你在做什么,以及之后你是如何检查\r\n的吗?
【解决方案2】:

我和 Jon Skeet 在同一条船上。这是我对 MemoryStream 的测试,确认它确实使用了你给它的 NewLine 值。

[Test]
public void NewLineIsUnixStyle()
{
    using (var text = new MemoryStream())
    using (TextWriter writer = new StreamWriter(text))
    {
        writer.NewLine = "\n";

        writer.WriteLine("SO");
        writer.Flush();

        text.Position = 0;
        var buffer = new byte[10];
        var b3 = buffer[3];
        Assert.AreEqual(3, text.Read(buffer, 0, 10));
        Assert.AreEqual('S', (char)buffer[0]);
        Assert.AreEqual('O', (char)buffer[1]);
        Assert.AreEqual('\n', (char)buffer[2]);
        Assert.AreEqual(b3, buffer[3]);
    }
}

[Test]
public void NewLineIsSomeTextValue()
{
    using (var text = new MemoryStream())
    using (TextWriter writer = new StreamWriter(text))
    {
        writer.NewLine = "YIPPEE!";

        writer.WriteLine("SO");
        writer.Flush();

        text.Position = 0;
        var buffer = new byte[10];
        Assert.AreEqual(9, text.Read(buffer, 0, 10));
        Assert.AreEqual('S', (char)buffer[0]);
        Assert.AreEqual('O', (char)buffer[1]);
        Assert.AreEqual('Y', (char)buffer[2]);
        Assert.AreEqual('I', (char)buffer[3]);
        Assert.AreEqual('P', (char)buffer[4]);
        Assert.AreEqual('P', (char)buffer[5]);
        Assert.AreEqual('E', (char)buffer[6]);
        Assert.AreEqual('E', (char)buffer[7]);
        Assert.AreEqual('!', (char)buffer[8]);
        Assert.AreEqual(0, buffer[9]);
    }
}

随意修改其中一项并根据您的场景更新您的答案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-11
    • 1970-01-01
    • 2011-12-26
    • 2021-10-16
    • 2011-08-06
    相关资源
    最近更新 更多