C#如何在不写入txt文件的情况下清除streamwriter缓冲区?

C#如何在不写入txt文件的情况下清除streamwriter缓冲区?,c#,io,C#,Io,我正在Win7上开发C# 我需要使用Streamwriter写入txt文件 StreamWriter outfile = new StreamWriter(MY_PATH, true); foreach(a line of strings) { // process the line outfile.Write(String.Format(WIDTH + " " + WIDTH, num1Str+"\t", num2Str+"\t"));

我正在Win7上开发C#

我需要使用Streamwriter写入txt文件

   StreamWriter outfile  = new StreamWriter(MY_PATH, true);
   foreach(a line of strings)
   {
       // process the line
        outfile.Write(String.Format(WIDTH + " " + WIDTH, num1Str+"\t", num2Str+"\t"));

   }
   if all elements in line are "0"
      // do not write anything to the file, clear outfile buffer

   // WIDTH are constants. num1Str and num2Str are variables.
如何清除写入流缓冲区的内容


Flush不是一个解决方案,因为如果所有元素都为0,我不想写入文件。
任何帮助都将不胜感激

我相信你在找

更新:现在问题已经清楚了,您不需要
StreamWriter
,而是想利用
MemoryStream
之类的工具。考虑下面的片段:

   var writeToDisk = false;
   var outfile  = new MemoryStream();
   foreach(a line of strings)
   {
       // process the line

       // BTW: the `String.Format` you have here is exceptionally confusing
       // and may be attributing to why everything is \0
       outfile.Write(...);

       // set the flag to `true` on some condition to let yourself know
       // you DO want to write
       if (someCondition) { writeToDisk = true; }
   }

   if (writeToDisk)
   {
       var bytes = new byte[outfile.Length];
       outfile.Read(bytes, 0, outfile.Length);
       File.WriteAllBytes(MY_PATH, bytes);
   }

我相信你在找我

更新:现在问题已经清楚了,您不需要
StreamWriter
,而是想利用
MemoryStream
之类的工具。考虑下面的片段:

   var writeToDisk = false;
   var outfile  = new MemoryStream();
   foreach(a line of strings)
   {
       // process the line

       // BTW: the `String.Format` you have here is exceptionally confusing
       // and may be attributing to why everything is \0
       outfile.Write(...);

       // set the flag to `true` on some condition to let yourself know
       // you DO want to write
       if (someCondition) { writeToDisk = true; }
   }

   if (writeToDisk)
   {
       var bytes = new byte[outfile.Length];
       outfile.Read(bytes, 0, outfile.Length);
       File.WriteAllBytes(MY_PATH, bytes);
   }

我认为您需要的是
Any
来检查Any是否不是“0”,但也可以使用
use
来正确处理

if(someString.Any(a=> a != '0')) //if any elements in line are not '0'
{
    using(StreamWriter outfile  = new StreamWriter(MY_PATH, true))
    {
        foreach(char a in someString)
        {
            outfile.Write(WIDTH + " " + WIDTH, num1Str+"\t", num2Str+"\t");
        }
    }
}

我认为您需要的是
Any
来检查Any是否不是“0”,但也可以使用
use
来正确处理

if(someString.Any(a=> a != '0')) //if any elements in line are not '0'
{
    using(StreamWriter outfile  = new StreamWriter(MY_PATH, true))
    {
        foreach(char a in someString)
        {
            outfile.Write(WIDTH + " " + WIDTH, num1Str+"\t", num2Str+"\t");
        }
    }
}
如果行中的所有元素均为“0” //不要向文件写入任何内容,请清除文件缓冲区

那你为什么不在写之前检查一下你的文章的内容呢

// process the line
string line = String.Format(WIDTH + " " + WIDTH, num1Str+"\t", num2Str+"\t");
if(!line.Trim().All(c => c == '0'))
     outfile.Write(line);
如果行中的所有元素均为“0” //不要向文件写入任何内容,请清除文件缓冲区

那你为什么不在写之前检查一下你的文章的内容呢

// process the line
string line = String.Format(WIDTH + " " + WIDTH, num1Str+"\t", num2Str+"\t");
if(!line.Trim().All(c => c == '0'))
     outfile.Write(line);


Flush不是一个解决方案,因为如果所有元素都为0,我不想写入文件。应该删除缓冲区中的内容。@user2420472:那么您就不想使用
StreamWriter
。您已经将字节流式传输到磁盘。使用
MemoryStream
,然后如果要写入磁盘,请使用
文件。WriteAllBytes
并从
MemoryStream
向其提供字节。刷新不是解决方案,因为如果所有元素都为0,我不想写入文件。应该删除缓冲区中的内容。@user2420472:那么您就不想使用
StreamWriter
。您已经将字节流式传输到磁盘。改为使用
MemoryStream
,如果您想写入磁盘,请使用
文件。writealBytes
并从
MemoryStream
向其提供字节。我想您错过了使用
string.Format()
的要点。您的forloop做什么?它看起来像是为了好玩而循环书写。请你使用真实的代码,这样我们就可以看到什么取决于什么。因为你的“一行字符串”用在哪里?你去查韦斯吗?在这种情况下,你在哪里使用字符?好的,那么foreach有什么用呢?你是否把同一内容写了X次?num1Str和num2Str是的变量?它们是来自“字符串行”吗?@Thomas AndreèLian,num1Str和num2Str来自另一个数据结构。那么您的foreach循环在做什么?我想您没有抓住使用
string.Format()
forloop做什么的要点?它看起来像是为了好玩而循环书写。请你使用真实的代码,这样我们就可以看到什么取决于什么。因为你的“一行字符串”用在哪里?你去查韦斯吗?在这种情况下,你在哪里使用字符?好的,那么foreach有什么用呢?你是否把同一内容写了X次?num1Str和num2Str是的变量?它们是否来自“字符串行”?@Thomas AndreèLian,num1Str和num2Str来自另一个数据结构。那么您的foreach循环在做什么?trim()。all()在这里不起作用,我有嵌入宽度等数字。谢谢。如果您的所有数字都是
0
,它不会将该行写入文件。您的行仍然可以包含零。trim()仅按空格分区。行中有一些数字,比如宽度,它们是常量。trim().all()在这里不起作用,我有一些数字,比如嵌入的宽度。谢谢。如果您的所有数字都是
0
,它不会将该行写入文件。您的行仍然可以包含零。trim()仅按空格分区。行中有一些数字,例如宽度,它们是常量。但答案上仍然没有复选标记,讨厌那些他们不接受任何东西的问题。因此,问题永远不会“完成”。它们不是“完整的”。它们是不断发展和改进的知识集合。问题作者找到答案仅仅是问题旅程的开始。它成为一种被许多未来访问者发现、使用、改进并再次使用的标准资源,才是真正的价值所在。但答案上仍然没有复选标记,讨厌那些他们不接受任何东西的问题。因此,问题永远不会“完成”。它们不是“完整的”。它们是不断发展和改进的知识集合。问题作者找到答案仅仅是问题旅程的开始。它成为一种被发现、使用、改进并被许多未来访问者再次使用的规范资源,才是真正的价值所在。