2012-04-15 179 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