2012-04-15 177 views
-3

我想寫一個WCHAR陣列在C文件,但有某種類似變量和路徑這樣的fwrite()和文件損壞

c.:.\.p.r.o.g.r.a.m. .f.i.l.e.s.\.m.i.c.r.o.s.o.f.t. .v.i.s.u.a.l. .s.t.u.d.i.o. 1.0...0.\.v.c.\.i.n.c.l.u.d.e.\.x.s.t.r.i.n.g..l.i.s.t...i.n.s.e.r.t 

腐敗和unrelevant數據上都寫着以及正確的數據(example)我已經確認緩衝區是空終止的並且包含正確的數據。

繼承人我的代碼:

 myfile = fopen("logs.txt","ab+"); 
     fseek(myfile,0,SEEK_END); 
     long int size = ftell(myfile); 
     fseek(myfile,0,SEEK_SET); 
     if (size == 0) 
     { 
      wchar_t bom_mark = 0xFFFE; 
      size_t written = fwrite(&bom_mark,sizeof(wchar_t),1,myfile); 
     } 
// in another func 
      while (true) 
      { 
      [..] 
       unsigned char Temp[512]; 
       iBytesRcvd = recv(sclient_socket,(char*)&Temp,iSize,NULL); 
       if(iBytesRcvd > 0) 
       { 
        WCHAR* unicode_recv = (WCHAR*)&Temp; 
        fwrite(unicode_recv,sizeof(WCHAR),wcslen(unicode_recv),myfile); 
        fflush(myfile); 
       } 
      [..] 
      } 

可能是什麼造成的?

+1

你也許令人困惑wchar_t *與UTF-8? – 2012-04-15 17:21:03

+0

@DanielRoethlisberger是的,我可能會,但不知道該怎麼辦,但 – 2012-04-15 17:22:07

+1

@Panayiotis你*期待*寫什麼? – 2012-04-15 17:25:08

回答

1

recv()將不會終止&Temp,所以wcslen()運行實際上由recv()寫入的字節。你會得到正確的結果,如果你只是用iBytesReceived的字節數fwrite()而不是使用wcslen(),希望接收到的數據是正確的空值終止(寬NULL結尾,這是):

fwrite(unicode_recv, 1, iBytesReceived, myfile); 
+0

我試過你的建議,但還沒有運氣,也廣泛NULL終止它我用最後一個wchar(2字節),並將它們設置爲0(00 00)也許我應該做別的事情? – 2012-04-15 17:37:35

+0

你確定'sizeof(wchar_t)'在你的系統上是'2'而不是'4'嗎? – 2012-04-15 17:40:37

+0

well int size2 = sizeof(wchar_t);調試SAIS它的2:/ – 2012-04-15 17:41:58