2012-04-15 30 views
-3
私はCで、ファイルへのwcharの配列を書き込むしようとしている

は、しかしに書かれているこの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)とともにファイルに書き出しました。バッファがヌルで終了し、適切なデータが含まれていることを確認しました。

HERESに私のコード:

 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? –

+0

@DanielRoethlisbergerはい私はそうかもしれませんが、何をすべきかわかりません。 –

+1

@Panayiotisあなたは何を書こうとしていますか? –

答えて

1

recv()は、&TempをNULL終止しません。したがって、wcslen()は、実際にはrecv()で書き込まれたバイトを超えて実行されます。あなただけのwcslen()を使用して、データを受信望んfwrite()代わりのためのバイト数としてiBytesReceivedを使用する場合は、正しい結果を取得します(ワイドNULLで終了する、つまり)を正しくヌルで終了です:

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

私はあなたが提案したものを試しましたが、ワイルド・ターミネーションには最後のwchar(2バイト)を使用し、それらを0(00 00)に設定した方がいいかもしれません。 –

+0

あなたのシステムで 'sizeof(wchar_t)'が '2'で' 4'ではないと確信していますか? –

+0

よくint size2 = sizeof(wchar_t);デバッグされたsaisその2:/ –