流写入程序没有将修剪后的文本写入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的修剪文本整洁,但我不知道为什么它没有被写入文件。

流写入程序没有将修剪后的文本写入C#中的文件

这里有三个问题。

首先,从整个数组中获取文本,而不管实际接收到多少字节。很可能这就是零字符的来源。

要解决此问题,请按如下方式更改代码:

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");