【问题标题】:Add new line to a text file in loop statement在循环语句中向文本文件添加新行
【发布时间】:2015-09-22 20:19:20
【问题描述】:

我创建了一个从文本框中获取用户名的循环。我想将名称放入文本文件并每次添加一个新行。它不工作。它再次覆盖了以前的名称。我知道如何在文本文件中添加新行,但在循环语句中它不起作用。 这是我的代码:

for (int i = 0; i < txt_user.length ; i++ )
{
    File.WriteAllText(@"C:\mail\users.txt", txt_user[i].Text + Environment.NewLine);
}

这是一个循环外的示例代码,用于编写新行 - 它可以工作:

File.WriteAllText(@"C:\mail\users.txt", txt_user1.Text + Environment.NewLine + "abc");

【问题讨论】:

  • 好吧File.WriteAllText 会覆盖内容。您想打开文件并向其中写入行。我建议您查看StreamWriter。还要注意你现在拥有它的方式(假设它工作)会打开文件,写一行,关闭文件,重复,重复,重复。那很糟。你想打开它,写下你所有的东西,然后关闭它。效率更高。
  • 改用AppendAllText 方法。
  • 出于我提到的原因,我建议不要使用@Jens 解决方案。没有理由一遍又一遍地打开和关闭文件。这比做一次效率低得多。
  • @Jens 同意,但您直到现在才提到 StringBuilder。你只是告诉他使用不同的方法。

标签: c# loops text-files newline


【解决方案1】:

你很接近:有File.AppendAllText()File.AppendText()。您也可以先收集内存中的所有行并使用File.AppendAllLines()(如果您有足够的 RAM 来存储所有行)。

WriteAllText() 将写入一个新文件或覆盖现有文件。

这对于较小的文件来说足够好,因为操作系统可能会应用一些缓存策略。但是,对非常大的文件循环执行此操作可能效率不高。那你应该看看FileStreams。

【讨论】:

  • 考虑到我们不知道他的循环是否有 2 个条目或 20 亿个,我认为这是一个糟糕的建议。他应该在循环外 File.Open,写入他的内容,然后在循环外关闭流。这个答案可能会打开/关闭文件数十亿次,因为我们不知道循环执行了多少次。
  • @ThomasWeller 这些都没有我给出的答案那么有效,而且我几乎不会认为我的答案难以实施。当正确的方法如此容易时,为什么要以错误的方式去做呢?虽然,我同意,但假设他拥有数十亿个文本控件是很愚蠢的。
  • @ThomasWeller 为什么在您不了解他的要求时做出假设?当程序员构建他们“认为”用户想要的东西而不是用户想要的东西时,这就是我们得到设计缺陷的方式。
  • @dman2306:好的。随意添加一个更好的答案,我会支持它
  • @dman:还要考虑到 OP 还在学习中。他现在学过一次。只要他会明白。 StreamWriter 解决方案涉及using 语句。如果他想稍后添加文本怎么办? using 会妨碍他,他将其删除并遇到 IDisposable 问题。那不是更好。如果你建议使用using 声明,别忘了告诉他这是什么意思。
【解决方案2】:

如果实体太多,最好使用此代码

 using (StreamWriter sw = File.CreateText(@"C:\mail\users.txt")) 
        {
      for (int i = 0; i < txt_user.length ; i++ )
           {
            sw.WriteLine(txt_user[i].Text);   
           }
        }   

【讨论】:

  • 除非额外的 WriteLine 不会在每条记录之间结束 \r\n\r\n\r\n 吗? WriteLine 已经以新行结束。
【解决方案3】:

这将打开文件一次,并在枚举文本文件时将行写入文本文件,然后关闭文件。它不会进行多次打开,也不会尝试在此过程中构建大字符串,这可能使其成为迄今为止给出的一堆答案中最高效的 I/O 和内存。

File.WriteAllLines(@"C:\mail\users.txt",
  Enumerable
    .Range(0,txt_user.length)
    .Select(i=>txt_user[i].Text));

【讨论】:

  • 即使我不喜欢 LINQ,您的回答也可能与 StreamWriter 解决方案一样高效:+1
  • WriteAllLines 本质上是幕后的流写入器解决方案,无需重新发明。
【解决方案4】:

如果要添加到现有文件,请使用 File.AppendText。

【讨论】:

    【解决方案5】:

    我建议使用 StringBuilder:

    var builder = new StringBuilder();
    for (int i = 0; i < txt_user.length ; i++ )
        builder.AppendLine(txt_user[i].Text);
    File.WriteAllText(@"C:\mail\users.txt", builder.ToString());
    

    【讨论】:

      【解决方案6】:

      不要一直打开和关闭文件(因为File.WriteAllText 在每次调用时都会这样做),而是使用字符串生成器准备文本并立即将其写入文件。由于文本来自文本框,我假设生成的字符串不会很长。

      var sb = new Stringbuilder();
      for (int i = 0; i < txt_user.length; i++)
      {
          sb.AppendLine(txt_user[i].Text);
      }
      File.WriteAllText(@"C:\mail\users.txt", sb.ToString());
      

      【讨论】:

        猜你喜欢
        • 2018-05-03
        • 2010-10-20
        • 1970-01-01
        • 1970-01-01
        • 2021-12-31
        • 2019-12-20
        • 1970-01-01
        • 2014-11-17
        • 1970-01-01
        相关资源
        最近更新 更多