繁体   English   中英

为什么空格会出现在C#TextWriter文件的末尾?

[英]Why does whitespace appear at the end of my C# TextWriter file?

我已经使用TextWriter C#创建了一个文本文件,最终创建时,该文本文件通常在文件末尾具有多行空白。 空格不包含在组成文件的任何字符串对象中,我也不知道是什么原因引起的。 文件越大,空格越多。

我已经尝试了各种测试,以查看是否基于字符串的内容出现空白,但这不是事实。 即我已经确定了空格开始的行数,并为完全不同的东西更改了字符串,但是空格仍然存在。

//To start:
MemoryStream memoryStream = new MemoryStream();
TextWriter tw = new StreamWriter(memoryStream);

//Loop through records & create a concatenated string object
string strUTL1 = string.Format("{0}{1}{2}{3}{4}{5}{6}{7}", strUTL1_1, strUTL1_2, strUTL1_3, strUTL1_4, strUTL1_5, strUTL1_6, strUTL1_7, strUTL1_8);

//Add the line to the text file
tw.WriteLine(strUTL1);

//Once all rows are added I complete the file
tw.Flush();
tw.Close();


//Then return the file
return File(memoryStream.GetBuffer(), "text/plain", txtFileName);

我不想在完成后操作文件(例如,替换空格),因为这可能导致其他问题。 该文件将与第三方交换,并且需要正确格式化。

谢谢您的帮助。

正如MemoryStream.GetBuffer的文档所述

请注意,缓冲区包含分配的字节,这些字节可能未使用。 例如,如果将字符串“ test”写入MemoryStream对象,则从GetBuffer返回的缓冲区的长度为256,而不是4,未使用252个字节。 要仅获取缓冲区中的数据,请使用ToArray方法。 但是,ToArray会在内存中创建数据的副本。

使用.ToArray() (它将分配一个合适大小的新数组),或者您可以使用从.GetBuffer()返回的缓冲区,但是您需要检查.Length以查看其中有多少个有效字节。

GetBuffer()返回所有已分配的内存,几乎总是比实际写入的字节更多。

可能我建议改用Encoding.UTF8.GetBytes(...)

string strUTL1 = string.Format("{0}{1}{2}{3}{4}{5}{6}{7}", strUTL1_1, strUTL1_2, strUTL1_3, strUTL1_4, strUTL1_5, strUTL1_6, strUTL1_7, strUTL1_8);

var bytes = Encoding.UTF8.GetBytes(strUTL1);

return File(bytes, "text/plain", txtFileName);

使用ToArray()而不是GetBuffer() ,因为缓冲区大于所需的缓冲区。

通常就是这种情况。 与缓冲区一起使用的类或函数通常会保留一定大小的内存来保存数据。 然后,该函数将返回一个值,即已将多少字节写入缓冲区。 然后,您只能使用缓冲区的前n个字节。

MSDN的引用:

例如,如果将字符串“ test”写入MemoryStream对象,则从GetBuffer()返回的缓冲区的长度为256,而不是4,未使用252个字节。 要仅获取缓冲区中的数据,请使用ToArray()方法; 但是,ToArray()在内存中创建数据的副本。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM