【问题标题】:C# ignores \n in a string when written in a fileC# 在写入文件时忽略字符串中的 \n
【发布时间】:2014-04-15 05:49:13
【问题描述】:

我有一个简单的字符串,其中包含 '\n'。它应该被写入文件。例如:

var s = new StringBuilder();

s.Append("hello");
s.Append("\n");
s.Append("betty");
s.Append("is");
s.Append("my");
s.Append("\n");
s.Append("name");

string str = s.ToString();
Console.WriteLine(str);

此字符串按预期打印:

你好 贝蒂主义 姓名

现在,当我尝试使用以下内容将此字符串写入文件时:

var w = new StreamWriter(crcFilePath);
w.WriteLine(crcString);
w.Close();

文件内容为:

hellobettyismyname

知道为什么它会忽略字符串中的 \n。

【问题讨论】:

  • 使用Environment.NewLine 而不是"\n"
  • scrcString 有什么关系?
  • 请看一下 [this][1] 这可能与此问题重复。 [1]:stackoverflow.com/questions/2617752/…
  • crcString 显然比您向我们展示的差异更多,一方面,第二个示例中的名称是 ashna,而第一个示例中的名称是 betty。请出示SSCCE example
  • 其实这只是一个例子。该字符串是在一个 C++ dll 中构造的,其中包含 '\n'。

标签: c#


【解决方案1】:

可能是您用来查看文件的应用程序或系统忽略了换行,而不是 C# 忽略了它。尝试使用System.Environment.NewLine 或\r\n,而不是\n。有关 \r 和 \n 的信息,请参阅 this question。此外,Notepad++ 可以显示包括新行在内的空白字符,这在这种情况下会很方便。

【讨论】:

  • 是的,在字符串中使用 \r\n 有效。 C# 并没有忽略它。
  • @user2695082 好!我编辑并添加了一些资源。
【解决方案2】:

文件内容为:

 helloashnaismyname

文件的内容实际上是这样的(十六进制模式):

==========================================================================
      xDump Version 1.04 - Hex Dump Utility
      Copyright (c) Xidicone Pty Ltd 20013  -  All rights reserved.
==========================================================================
0000: 68 65 6C 6C 6F 0A 62 65   74 74 79 69 73 6D 79 0A | hello.bettyismy. 
0010: 6E 61 6D 65 0D 0A                                 | name..           
==========================================================================

知道为什么它会忽略字符串中的 \n。

从十六进制转储中可以看出,它没有忽略 \n 字符。

问题是我怀疑你在记事本中打开了文件,它并没有理解行尾标记,因此它显示错误。

将代码更改为这样,记事本将按预期加载文件:

    var s = new StringBuilder();
                s.Append("hello");
                s.Append("\r\n");
                s.Append("betty");
                s.Append("is");
                s.Append("my");
                s.Append("\r\n");
                s.Append("name");
                string str = s.ToString();

【讨论】:

    【解决方案3】:

    你应该使用 environment.newLine。最好的方法是:

    s.Append(string.Format("Foo{0}Bar", Environment.NewLine));
    

    整个字符串中的 {0} 将被 string.Format 方法中的第二个参数替换(在本例中是一个新行)。这是一种干净且推荐的方法。

    【讨论】:

    • 所以您将someone else's comment 转换为答案?
    • 其实完全不同。最终结果是相同的,但最好的布局方式是我上面的方式。您引用的评论只是一个直接的交换,如果直接扔到字符串中会看起来很难看。我不认为评论是一个很好的答案。
    【解决方案4】:

    您可以使用s.AppendLine() 代替s.Append("\n"); 试一试。 StringBuilder.AppendLine() Method

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-04
      • 1970-01-01
      • 2014-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-19
      相关资源
      最近更新 更多