10

C# プログラムで Unix スタイルの改行を含むテキスト ファイルを書き込もうとしています。

何らかの理由で、次のコードは機能しません。

TextWriter fileTW = ...

fileTW.NewLine = "\n";

fileTW.WriteLine("Hello World!");

これもありません:

TextWriter fileTW = ...

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

どちらの場合も、'\n' は '\r\n' に置き換えられていますが、これは望ましくありません。これを 16 進エディタで確認したところ、0x0D0A で終わる各行が表示されました。

何か案は?

ありがとう!

編集:

皆さんごめんなさい、誤警報!

説明させてください...

私の TextWriter は、SharpZLib を使用して tar アーカイブに追加されていた MemoryStream に書き込んでいました。WinZIP を使用してテキスト ファイルを抽出すると、\n のすべてのインスタンスが \r\n に置き換えられたことが判明しました。同じ tar アーカイブを Ubuntu マシンにコピーして展開すると、そこには \n しかありません。変!

誰かの時間を無駄にしてごめんなさい!ありがとう!

4

2 に答える 2

18

これを再現できません。サンプルコード:

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" が1バイトです。プロパティを設定しないNewLine場合は 7 ("\r\n" の場合は 2 つ) です。

問題を実証する同様の短いが完全なプログラムを考え出すことができますか? その後、ファイルに「\r\n」が含まれていることをどのように判断していますか?

于 2011-10-20T20:25:17.547 に答える
1

私はジョン・スキートと同じ船に乗っています。これは、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]);
    }
}

これらのいずれかを自由に変更して、シナリオで回答を更新してください。

于 2011-10-20T20:43:35.693 に答える