【问题标题】:List of strings wont get written completely to text file字符串列表不会完全写入文本文件
【发布时间】:2011-08-14 03:49:34
【问题描述】:

我试图从一个文本文件中读取并写入另一个文本文件。我读取的文件有 2023 行,而我正在写入的文件只有 2008 行。我无法弄清楚另一条线路发生了什么......我在某处失去了它们。我做错了什么?

谢谢!

这是我的 C# 代码。

     static void Main(string[] args)
    {
        StreamWriter writer = new StreamWriter("C:/Users/Rafael/desktop/newfile.txt");
        StreamReader reader = new StreamReader("C:/Users/Rafael/desktop/new1.txt");//, System.Text.Encoding.GetEncoding("ISO-8859-1"));
        string line;
        while ((line = reader.ReadLine()) != null)
        {

            writer.WriteLine(line);
        }

    }

【问题讨论】:

  • 文件末尾是否缺少行?

标签: c# .net stream


【解决方案1】:

您在任何时候都没有关闭流写入器 - 因此它可能不会写入文件。你可以通过在循环之后调用 Close() 来测试这一点,或者如果你还没有完成文件,你可以使用 Flush()。

如果有选择,我会重写代码以使用 Using{} 块,当流超出范围时,它会通过调用 Dispose() 自动关闭流。

【讨论】:

    【解决方案2】:

    很可能是输出没有被刷新,因为您没有在编写器上调用Dispose(),所以缓冲的输出被丢弃了。

    当您使用以这种方式实现 IDisposable 的类时,您应该始终将它们包装在 using 块中:

    static void Main(string[] args)
    {
        using (StreamWriter writer = new StreamWriter("C:/Users/Rafael/desktop/newfile.txt"))
        using (StreamReader reader = new StreamReader("C:/Users/Rafael/desktop/new1.txt"))
        {
            string line;
            while ((line = reader.ReadLine()) != null)
            {
    
                writer.WriteLine(line);
            }
        }
    }
    

    【讨论】:

    • 好吧,我会说“如果可能”将它们包装在 using 块中;如果您通过多次调用(例如,在成员变量中)打开要使用和存储的文件,这将不起作用。
    • @shelleybutterfly:那么拥有StreamWriter 的东西应该自己实现IDisposable 并在Dispose 的实现中为那个东西调用StreamWriter.Dispose
    • @shelleybutterfly:“使用类”是指像这样的内联代码。当然,你说的没错,那么包含的类应该是IDisposable等等。
    • @Yahia:实际上,他不是。他的语法是perfectly legal 代表using 块。
    • @Jason:我宁愿指出在 any 单语句块周围省略大括号是合法的。这么说会让using 看起来很特别,其实不然。
    【解决方案3】:

    这是实现细节非常重要的地方。基本上,当您写入StreamWriter 时,您写入的文本不一定会提交到磁盘上的文件。相反,它可能位于某处的缓冲区中,并且必须刷新该缓冲区才能提交到磁盘。 StreamWriter 本身会定期刷新此缓冲区。但是,如果您让进程终止而不进行最终刷新,则缓冲区仍可能保存未提交的写入。

    因此,请致电 writer.Flushwriter.Closewriter.Dispose,或者最好将您对 StreamWriter 的使用包装在 using 块中,以便为您处理。

    【讨论】:

      【解决方案4】:

      此外,如果您不想关闭文件。你可以使用flush

      【讨论】:

        【解决方案5】:

        ReadLine() 在该行不包含任何字符时返回一个空字符串... 致电Flush()Close() ...考虑使用using...

        您为什么不直接复制整个文件 (File.Copy)?

        【讨论】:

        • 我没有使用 File.Copy,因为我必须先对字符串进行一些排序,然后才能将其写回新文件。但是调用 flush() 解决了我的问题。感谢您的帮助。
        【解决方案6】:

        在循环结束后对作者调用Flush()

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-06-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多