I'm trying to write a text file with Unix-style newlines with my C# program.
For some reason the following code doesn't work:
TextWriter fileTW = ...
fileTW.NewLine = "\n";
fileTW.WriteLine("Hello World!");
Neither does this:
TextWriter fileTW = ...
fileTW.Write("Hello World! + \n");
In both cases the '\n' is being replaced with '\r\n', which I don't want! I've been verifying this with a hex editor, which shows each line ending in 0x0D0A.
Any ideas?
Thanks!
EDIT:
Sorry everyone, false alarm!
Allow me to explain...
My TextWriter was writing to a MemoryStream, which was then being added to a tar archive using SharpZLib. It turns out that by extracting the text file using WinZIP, it was replacing every instance of \n with \r\n. If I copy the same tar archive to my Ubuntu machine and extract there, only the \n is there. Weird!
Sorry if I wasted anyone's time! Thanks!
I'm unable to reproduce this. Sample code:
using System;
using System.IO;
class Test
{
static void Main()
{
using (TextWriter fileTW = new StreamWriter("test.txt"))
{
fileTW.NewLine = "\n";
fileTW.WriteLine("Hello");
}
}
}
Afterwards:
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
Note the size - 6 bytes - that's 5 for "Hello" and one for the "\n". Without setting the NewLine
property, it's 7 (two for "\r\n").
Can you come up with a similar short but complete program demonstrating the problem? How are you determining that your file contains "\r\n" afterwards?
I'm in the same boat as Jon Skeet. Here's my tests against a MemoryStream that confirm it does use what you give it as the NewLine value.
[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]);
}
}
Feel free modify one of these and update your answer with your scenario.