C# 用C编写Unix风格的文本文件#
我正试图用我的C#程序编写一个带有Unix风格新行的文本文件 由于某些原因,以下代码不起作用:C# 用C编写Unix风格的文本文件#,c#,newline,textwriter,C#,Newline,Textwriter,我正试图用我的C#程序编写一个带有Unix风格新行的文本文件 由于某些原因,以下代码不起作用: TextWriter fileTW = ... fileTW.NewLine = "\n"; fileTW.WriteLine("Hello World!"); 这也不是: TextWriter fileTW = ... fileTW.Write("Hello World! + \n"); 在这两种情况下,'\n'都被替换为'\r\n',我不希望这样!我已经用一个十六进制编辑器验证了这一点,
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存在。奇怪
对不起,我浪费了任何人的时间!谢谢 我无法复制这个。示例代码:
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字节-5表示“Hello”,1表示“\n”。如果不设置换行符
属性,则为7(两个表示“\r\n”)
你能想出一个类似的简短但完整的程序来演示这个问题吗?之后如何确定文件中是否包含“\r\n”?我和Jon Skeet处境相同。下面是我对MemoryStream的测试,它确认它确实使用了您给它的换行符值
[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]);
}
}
请随意修改其中一个,并根据您的情景更新您的答案。您使用TextWriter的原因是什么?例如,您可以使用FileStram…我首先使用TextWriter写入MemoryStream。似乎在稍后我尝试将MemoryStream写入文件时添加了/r,而不是由TextWriter添加。让我做一点挖掘,我会回到大家身边!谢谢大家抽出时间!谢谢你,乔恩!你的代码在我这边也能正常工作。当我尝试将MemoryStream写入文件时,似乎/r是稍后添加的,而不是由TextWriter添加的。让我做一点挖掘,我会回到大家身边@dan6470:我非常怀疑
MemoryStream
是否在做这样的事情。您能告诉我们更多关于您正在做什么,以及之后如何检查\r\n
的信息吗?