rt         CFile FileRead;

if(!FileRead.Open("C:\\abc.jpg",CFile::modeRead))
return "";
DWORD fLen = FileRead.GetLength();
char* pBuff = new char[fLen]; 
FileRead.Read(pBuff,fLen);
FileRead.Close();

CString strImage(pBuff);
delete [] pBuff;strImage的内容写入文件(还原)后,格式不正确,如果将pBuff写入则可以。原因何在?

解决方案 »

  1.   

    因为CString以0为结束,在写入文件时可能并没有全部写入,造成文件格式不对
      

  2.   

    恩我想你还是对比一下从CString生成的文件和原文件的异同。同意楼上的说法,差错可能出现在开头或者结尾的地方。
    另外,你说的格式不对是怎么知道的,是否在图片浏览器中无法打开?
      

  3.   

    CString变量GetLength()只有4,不是应有大小。
    写入文件后大小只有1K.
      

  4.   

    DWORD fLen = FileRead.GetLength();
    char* pBuff = new char[fLen+1]; 
    FileRead.Read(pBuff,fLen);
    FileRead.Close();

    char[fLen+1]='\0';//强制赋值
    CString strImage;
    strImage.Format("%s",pBuff);试试      
      

  5.   

    jpg文件应该是一个流式文件而不能算是一个文本文件,其中难免有连续的字节表示的是数字0,注意不是字符'0',而将包括这段地址的一段内存保存至CString中时,字数0其实就是NULL,就是CString.GetLength()被截断的地方,以至于你得不到Buf真实长度.而用buf[1024*14],就不存在这个问题。
      

  6.   

    char* pBuff = new char[fLen+1];
      

  7.   

    to:laiyiling
    不行,我早试过了。
      

  8.   

    不应该用CString或者char[],用这两个是永远无法实现你的要求的!
    应该用CByteArray,或者BYTE[](后者需要管理长度)。
    随时要记得这样一个事实,一个CString或char[]中只能有唯一的一个'\0'是有效的,那就是它的结束符,之后的内容原则上是无效数据。
    ——非文本文件里面有多少个'\0'啊!!
      

  9.   

    base64是个好办法另外,可以使用CString::GetBuffer来保存和获取数据,注意参数一定要是文件的长度+1,否则有可能被裁减。另外不能直接使用CString来赋值或者输出,原因楼上已经说过,要使用GetBuffer取道指针,然后对指针进行操作
      

  10.   

    用CString我成功了不过用BYTE确实是好办法