【问题标题】:How to write formatted string in text file如何在文本文件中写入格式化字符串
【发布时间】:2018-09-20 08:36:15
【问题描述】:

我正在使用StringBuilder 来格式化我的字符串值,如下所示

学号:3602

注册时间:2018 年 9 月 11 日上午 12:00:00

报名人数:0

但是当我使用以下代码将其写入文本文件时

using (StreamWriter sw = new StreamWriter(@"LocaltempPath\Sheet.txt"))
{
    sw.WriteLine(sb.ToString());
}

我的整个格式都被遗漏了,而不是上面显示的格式,值被复制到一行文本文件中!写入文本文件时如何保留格式?

更新:我的 StringBuilder 代码

 StringBuilder sb = new StringBuilder("Student Number: " + StId);
 sb.Append("\n");
 sb.Append("Registered On: " + regdate);
 sb.Append("\n");
 sb.Append("Enrollment No: " + regnumber);
 sb.Append("\n");

【问题讨论】:

  • 显示将数据放入字符串构建器的代码
  • 你确定是一行吗?当您仅使用换行符 (\n) 作为行分隔符并在 Windows 记事本中打开文件时,它将是单行。但是,当您使用支持 Linux 行尾的良好编辑器时,文件将正确显示。第二种选择是,sb 中的字符串实际上是在没有新行的情况下创建的
  • File.WriteAllText(@"LocaltempPath\Sheet.txt", sb.ToString()); 检查sb 是否有新行 (\n)。 Console.Write(sb.ToString()); - 你能看到格式还是一行?
  • @CaiusJard 请查看更新代码..谢谢
  • sb.AppendLine(); 而不是sb.Append("\n");:一些程序(如记事本)不喜欢\n 但想要Windows \r\n

标签: c# .net string text stringbuilder


【解决方案1】:

使用 sb.AppendLine 而不是 sb.Append 将文本添加到单独的行中。 此外,如果您正在写入文件并需要下一行,请使用 Environment.NewLine 而不是 \n。

【讨论】:

    【解决方案2】:

    根据 cmets,请勿使用硬编码的“\n”来表示换行符,除非您正在为 unix 系统准备数据

    改为这样做:

    StringBuilder sb = new StringBuilder("Student Number: " + StId);
    sb.AppendLine();
    sb.AppendLine("Registered On: " + regdate);
    sb.AppendLine("Enrollment No: " + regnumber);
    

    AppendLine() 可以在不带任何参数的情况下使用,只放入一个换行符,我在上面这样做是为了在您创建字符串构建器的字符串的末尾添加一个新行。也可以这样做:

    StringBuilder sb = new StringBuilder();
    sb.AppendLine("Student Number: " + StId);
    sb.AppendLine("Registered On: " + regdate);
    sb.AppendLine("Enrollment No: " + regnumber);
    

    如果您想更好地控制日期等格式:

    StringBuilder sb = new StringBuilder();
    sb.AppendLine("Student Number: " + StId);
    sb.AppendFormat("Registered On: {0:yyyy-MM-dd HH:mm:ss.fff}\r\n", regdate);
    sb.AppendLine("Enrollment No: " + regnumber);
    

    最后,在字符串生成器上对 AppendXXX() 的每次调用都会返回相同的字符串生成器,因此您可以像这样调用并节省一些输入:

    StringBuilder sb = new StringBuilder();
    sb.Append("Student Number: ").AppendLine(StId)
      .Append("Registered On: ").AppendLine(regdate);
      .Append("Enrollment No: ").AppendLine(regnumber);
    

    确实,您应该避免将字符串连接与 + 和 stringbuilder 混合使用 - 如果您在进行大量字符串构建时仅使用 stringbuilder 会更有效。虽然它可能不会使您的代码更具可读性

    就可读代码而言,您可能还想知道您可以这样做:

    StringBuilder sb = new StringBuilder();
    sb.AppendLine($"Student Number: {StId}");
    sb.AppendLine($"Registered On: {regdate}");
    sb.AppendLine($"Enrollment No: {regnumber}");
    

    在这个简单的例子中它没有多大帮助,但它确实可以帮助连接很多东西的字符串:

    $"Student Number: {StId}, Registered On: {regdate}, Enrollment No: {regnumber}"
    //instead of
    "Student Number: " + StId + ", Registered On: " + regdate + ", Enrollment No: " + regnumber
    

    【讨论】:

      【解决方案3】:

      不同的操作系统(Unix、Windows、Mac)使用不同的换行符(Why?)。

      您正在明确使用\n,这是 Linux 的默认设置,但它在 Windows 上的处理将取决于您用于查看文件的编辑器(记事本将所有文本显示为一行)。要为新行使用系统默认字符,请使用sb.AppendLine()Environment.NewLine 而不是\n

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-12-14
        • 2021-08-24
        • 2021-12-13
        • 2013-08-10
        • 1970-01-01
        • 2023-04-05
        • 1970-01-01
        • 2013-07-28
        相关资源
        最近更新 更多