0

'\n'ファイルに送信している改行に関連して理解できないという奇妙な状況があります。改行は、およびのNewLineプロパティに従って処理されないようです。このコードは次のことを示しています。TextWriterEnvironment

String baseDir = Environment.GetEnvironmentVariable("USERPROFILE") + '\\';
String fileName = baseDir + "deleteme5.txt";
FileInfo fi = new FileInfo(fileName);
fi.Delete();
FileStream fw = new FileStream(fileName, FileMode.CreateNew, FileAccess.Write);
StreamWriter sw = new StreamWriter(fw);
Console.WriteLine(Environment.NewLine.Length);
Console.WriteLine(sw.NewLine.Length);
sw.Write("1\uf0f1\n2\ue0e1\n3\ud0d1\n");
sw.Flush();
sw.Close();

これを実行すると、コンソール出力は

2
2

ファイルを 16 進モードで見ると、次のようになります。

00000000h: 31 EF 83 B1 0A 32 EE 83 A1 0A 33 ED 83 91 0A ; 1�ƒ±.2�.3�ƒ'。

明らかに、API は 2 文字を示していますが、ファイルを見ると 1 文字しかありません。TextWriter の Write メソッドの説明を見ると、Write メソッドが 0A を NewLine プロパティに置き換えていないことがわかります。Write メソッドがそれを考慮していない場合、1 つではなく 2 つの NewLine プロパティを持つことの用途は何ですか? これらは何のためにあるのですか?

4

4 に答える 4

0

文字列内で \n としてエスケープされたすべての改行は、単一文字の ASCII 改行 (0x0A) (Windows の改行 0D0A ではない) であり、プログラマーが文字列内でこれらを形式 0D0A に変換する明示的な手順を実行しない限り、0x0A としてライターのストリームに出力されます。

TextWriter.NewLine プロパティは、WriteLine などのメソッドによってのみ使用され、呼び出しの一部として追加される暗黙的な改行の書式設定を制御します。

Environment.NewLineとの違いTextWriter.NewLineは、Environment.NewLine が読み取り専用であり、プログラマーによるクエリのみが意図されていることです。(これは、たとえば、「システム全体」の改行フォーマットのデフォルトを次のように変更できる Java とは異なります。System.setProperty("line.separator", x);

TextWriter.NewLineC#では、 に初期化された を使用して記述するときに、暗黙的な改行の形式を変更できますEnvironment.NewLine。行を読み取る TextReader メソッドを使用する場合、TextReader.NewLineプロパティはありません。リーダーの暗黙的な改行動作は、任意の 0x0A、0x0D、または 0D0A で改行することです。

rene が指摘したように、元の問題は次のように書くことで解決できます。

sw.Write("1\uf0f1\n2\ue0e1\n3\ud0d1\n".Replace("\n", Environment.NewLine));
于 2013-08-05T07:47:45.090 に答える
0

WriteLine メソッドを呼び出す場合のように暗黙的に使用するか、Write(String.Concat("Hello", Environment.NewLine) のように明示的に使用する場合は、環境に定義された行末文字を取得します。それを使って '\n' や '$' と言うと、あなたは私がどんな環境にいても、私が言うように行が終わると言っているのです. 動作を比較したい場合は、少しコードを書いて実行してください. Windows および Linux (mono) で

于 2013-08-04T10:13:23.223 に答える