我有一个奇怪的问题。我从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());
}
}
有人可以解释为什么会这样,以及我如何解决这个问题。
哦,在调试中我可以看到decodeData的剪裁文本整洁干净,但我不知道为什么它没有被写入文件。
答案 0 :(得分:4)
这里有三个问题。
首先,无论实际接收的字节数是多少,都从整个数组中获取文本。很可能这是你的零字符的来源。
要解决此问题,请按以下步骤更改代码:
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);
答案 1 :(得分:3)
你永远不会冲动作家 - 我怀疑一切都是缓冲的。您应该为using
使用StreamWriter
语句,以便在离开块时将其处理掉。然后,这将刷新文件。
你应该也查看从Stream.Read
返回的值,并且只使用实际已读取的缓冲区部分创建一个字符串。
最后,鉴于你有一个while(true)
循环,你不清楚你期望它如何终止。您目前只在收到例外时才会终止。如果ns.Read
返回0,您应该终止。
答案 2 :(得分:1)
试试这个:
decodedData = new string(decodedData.ToCharArray());
答案 3 :(得分:-1)
decodedData = decodedData.Trim(@"\0");