【问题标题】:Why does my C# program only write 251 rows to a file?为什么我的 C# 程序只将 251 行写入文件?
【发布时间】:2024-05-02 12:35:02
【问题描述】:

我有一个包含 369 个不同名称的列表,我想将这些名称打印到一个 csv 文件中。一切都很顺利,直到我查看输出的 csv 文件,它只有 251 行。我尝试改为输出到 .txt,但它仍然只输出 251 行。我已经调试了调试器,它仍在调用 writer.WriteLine() 369 次。

是否有某种写作限制?如果是这样,为什么是 251? 369个名字怎么写?

这是我的代码以防万一:

List<String> names = new List<String>();

//Retrieve names from a separate source.

var writer = new StreamWriter(File.OpenWrite(@"C:names.txt"));
        for (int i = 0; i < names.Count; i++ )
        {
            System.Console.WriteLine(names[i].ToString());
            writer.WriteLine(names[i].ToString());
        }
        System.Console.Write(names.Count);

控制台上的输出显示所有 369 个名称,names.Count 打印 369。

【问题讨论】:

  • 你能分享你输入的文本文件吗
  • 冲洗,就是这个词
  • 您仍然没有得到解决方案意味着您需要在此处分享您的文件并显示您的数据。
  • 解决办法是简单地关闭 writer。

标签: c# csv streamwriter


【解决方案1】:

您需要关闭您的 StreamWriter,最好的方法是使用 using 块,如下所示:

using(StreamWriter writer = new StreamWriter(File.OpenWrite("C:\\names.txt")) {
    // code here
}

using 块将始终调用StreamWriter.Dispose 方法,该方法具有刷新流的效果。目前,您的 StreamWriter 实例中有缓冲但未写入的数据。

【讨论】:

  • 谢谢!只需调用 writer.close 即可,但我会确保从现在开始使用“使用”。不敢相信这是一个如此简单的错误......
【解决方案2】:

您没有在任何地方显示您正确关闭writer。如果您的程序异常终止,写入器将永远不会被刷新到磁盘。

尝试使用using 块。

// NOTE: The is should be C:\names.txt.  The posted code is missing a \
using (var writer = new StreamWriter(File.OpenWrite(@"C:names.txt")))
{
    // Your code here
}

【讨论】:

    【解决方案3】:

    您必须在最后一次写入后刷新缓冲区。将 writer 放在 using 语句中。 写入器的 Dispose 方法刷新缓冲区。你也可以调用 writer.Flush()。但是由于您仍然必须确保编写器已被处置,因此只需按照其他建议将其放在 using 语句中。

    【讨论】:

    • 只调用Dispose()using 不同,除非Dispose()finally 块中。
    【解决方案4】:
    List<String> names = new List<String>();
    var sb = new StringBuilder()
    //Retrieve names from a separate source.
    
    
            for (int i = 0; i < names.Count; i++ )
            {
                System.Console.WriteLine(names[i].ToString());
                sb.WriteLine(names[i].ToString());
            }
    using (var writer = new StreamWriter(File.OpenWrite(@"C:\names.txt")))
    {
        writer.WriteLine(sb.ToString());
    }
    

    【讨论】: