2011-06-16 47 views
0

我有一個奇怪的問題。我從tcp客戶端獲取文本流並將其寫入文件。該流不充分,因此填充的同時將其轉換爲串中的字節數組的未填充部分被轉換爲\ 0所以最後結束有,流編寫器沒有將修剪文本寫入C中的文件#

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()); 
    } 
} 

一些人能解釋我這是爲什麼,我該如何解決htis出來。

哦在調試我可以看到decodedData有修剪後的文本整潔乾淨,但我不知道爲什麼它沒有被寫入文件。

+0

永遠循環嗎? – 2011-06-16 07:03:26

+0

是的,這個應用程序連接的設備不斷髮送連續的數據流 – swordfish 2011-06-16 08:57:23

回答

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); 
+0

Streamwriter看起來像這麼多,所以我只用了file.appendalltext,它在單行 – swordfish 2011-06-16 09:47:52

3

你永遠不會沖淡作家 - 我懷疑一切都只是緩衝。您應該爲您的StreamWriter使用using聲明,以便在您離開該塊時處理它。這將然後刷新文件。

您應該看從Stream.Read返回的值,並且只使用實際上已被讀取的緩衝區部分創建一個字符串。

最後,目前還不清楚你會如何終止,因爲你有一個while(true)循環。您目前只會在發生異常時終止。你或許應該終止,如果ns.Read返回0

-1

你試過......

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

試試這個:

decodedData = new string(decodedData.ToCharArray()); 

IIRC,字符串構造將修剪後空終結。