流编写器没有将修剪过的文本写入C#中的文件

时间:2011-06-16 06:59:38

标签: c# stream

我有一个奇怪的问题。我从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的剪裁文本整洁干净,但我不知道为什么它没有被写入文件。

4 个答案:

答案 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());
IIRC,字符串构造函数将修剪尾随的NULL终止符。

答案 3 :(得分:-1)

你试过试试......

 decodedData = decodedData.Trim(@"\0");