2012-04-15 27 views
-3

Ich versuche, eine wchar Array in eine Datei in C zu schreiben, aber es ist eine Art von Korruption und unrelevant Daten wie Variablen und Pfade wie diesefwrite() und Datei Korruption

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 

geschrieben auf zu der Datei zusammen mit den korrekten Daten (example) Ich habe bestätigt, dass der Puffer nullterminiert ist und die richtigen Daten enthält.

Heres mein Code:

 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); 
       } 
      [..] 
      } 

Was dies verursachen könnte?

+1

Sind Sie vielleicht verwirrend wchar_t * mit UTF-8? –

+0

@DanielRoethlisberger Ja, ich könnte sein, aber unsicher, was zu tun ist, obwohl –

+1

@Panayiotis, was * erwarten * geschrieben werden? –

Antwort

1

recv() wird nicht Null-terminieren &Temp, so wcslen() läuft über die Bytes tatsächlich von recv() geschrieben. Sie werden korrekte Ergebnisse erhalten, wenn Sie nur für fwrite()iBytesReceived als Byteanzahl anstelle wcslen() der Verwendung und der Hoffnung, die empfangenen Daten korrekt nullterminierte (wide-NULL-terminierten, das ist):

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

Ich habe versucht, was Sie vorgeschlagen, aber kein Glück immer noch, auch zu Wide-NULL-terminate ich habe die letzte wchar (2 Bytes) und setzen sie gleich 0 (00 00) vielleicht hätte ich etwas anderes tun sollen? –

+0

Sind Sie sicher, dass 'sizeof (wchar_t)' '2' und nicht' 4' auf Ihrem System ist? –

+0

gut int size2 = sizeof (wchar_t); debugged sais it 2:/ –