流写入程序没有将修剪后的文本写入C#中的文件
本文关键字:文本 文件 程序 修剪 | 更新日期: 2023-09-27 17:59:20
我有一个奇怪的问题。我正在从一个tcp客户端获得一个文本流,并将其写入一个文件。流没有完全填充,因此在将其转换为字符串时,字节数组中未填充的部分被转换为''0,因此我最终得到
str = "blah foo bar '0'0'0'0'0...";
所以我做的是
str = str.trim(''0');
但如果我这样做,那么字符串就不会使用流写入器写入文件。如果我评论修剪线,那么它将与所有空白字符一起书写。这是我的完整代码
StreamWriter sw = new StreamWriter("c:''a''ta.txt");
while (true)
{
try
{
NetworkStream ns = tc.GetStream();
byte[] instream = new byte[tc.ReceiveBufferSize];
Thread.Sleep(2500);
ns.Read(instream, 0, tc.ReceiveBufferSize);
string decodedData = string.Empty;
decodedData = System.Text.Encoding.ASCII.GetString(instream);
decodedData = decodedData.Trim(''0');
//string a = "dfdsfdsfdsfdsf";
//string b = a.Trim(''0');
try
{
sw.Write(decodedData);
//MessageBox.Show(decodedData);
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
}
有人能解释我为什么会这样,以及我如何解决这个问题吗。
哦,在调试时,我可以看到decodedData的修剪文本整洁,但我不知道为什么它没有被写入文件。
这里有三个问题。
首先,从整个数组中获取文本,而不管实际接收到多少字节。很可能这就是零字符的来源。
要解决此问题,请按如下方式更改代码:
int actuallyRead = ns.Read(instream, 0, tc.ReceiveBufferSize);
string decodedData = Encoding.ASCII.GetString(instream, 0, actuallyRead);
其次,您需要关闭流,以便它刷新内容。最好的方法是将其封装在using
块中:
using (StreamWriter sw = new StreamWriter("c:''a''ta.txt"))
{
... rest of your code here
}
第三,代码通常永远不会完成。添加一种不依赖异常处理即可完成的方式,例如:
int actuallyRead = ns.Read(instream, 0, tc.ReceiveBufferSize);
if (actuallyRead == 0)
break;
string decodedData = Encoding.ASCII.GetString(instream, 0, actuallyRead);
您永远不会刷新写入程序-我怀疑一切都是缓冲的。您应该为StreamWriter
使用using
语句,以便在离开块时将其处理掉。然后将刷新文件。
您还应该查看从Stream.Read
返回的值,并且只使用实际读取的缓冲区部分创建一个字符串。
最后,考虑到您有一个while(true)
循环,还不清楚您希望它如何终止。当前只有在出现异常时才会终止。如果ns.Read
返回0,您可能应该终止。
试试这个:
decodedData = new string(decodedData.ToCharArray());
IIRC,字符串构造函数将修剪后面的NULL终止符。
你试过。。。
decodedData = decodedData.Trim(@"'0");