我正在尝试用我的c#程序编写一个带有unix风格换行符的文本文件。
由于某些原因,下面的代码不能工作:
TextWriter fileTW = ...
fileTW.NewLine = "n";
fileTW.WriteLine("Hello World!");
TextWriter fileTW = ...
fileTW.Write("Hello World! + n");
在这两种情况下,'n'都被'rn'取代了,这是我不想要的!我一直在用十六进制编辑器验证这一点,它显示以0x0da结尾的每行。
任何想法?
谢谢!
编辑:对不起大家,虚惊一场!
请允许我解释一下……
我的textwwriter正在写入内存流,然后使用SharpZLib将其添加到tar存档中。事实证明,通过使用WinZIP提取文本文件,它将n的每个实例替换为rn。如果我将相同的tar文件拷贝到我的Ubuntu机器上并在那里进行解压缩,那么只有n在那里。奇怪!
如果我浪费了大家的时间,我很抱歉!谢谢!我无法复制这个。示例代码:
using System;
using System.IO;
class Test
{
static void Main()
{
using (TextWriter fileTW = new StreamWriter("test.txt"))
{
fileTW.NewLine = "n";
fileTW.WriteLine("Hello");
}
}
}
后来:
c:usersjonTest>dir test.txt
Volume in drive C has no label.
Volume Serial Number is 4062-9385
Directory of c:usersjonTest
20/10/2011 21:24 6 test.txt
1 File(s) 6 bytes
注意大小- 6个字节-"Hello"是5个,"n"是1个。如果不设置NewLine
属性,则为7("rn"为2)。
你能想出一个类似的简短但完整的程序来演示这个问题吗?如何确定文件之后包含"rn"?
我和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]);
}
}
请随意修改其中一个,并根据您的场景更新您的答案。