很奇怪的问题!帮看一下!

f26511314 2002-11-04 09:15:20
我用CFile 类打开一个*.bmp格式的文件,读到pbuf里面,如果直接把pbuf赋给CString变量 kkk,那么kkk的长度只有5,而作个循环把pbuf的值给kkk,那么kkk的长度就是文件的大小了。怎样才能把pbuf实际的值给kkk呢,如果是大文件的话做个for循环太慢了。
if(cfile.Open(file,CFile::modeRead |CFile::shareDenyWrite ,&e))
{
len=cfile.GetLength();
pbuf = new char[len];
UINT nBytesRead = cfile.Read( pbuf,len);
cfile.Close();

int nLen;
CString kkk;
///////////
kkk=pbuf;
nLen=kkk.GetLength(); ///////nLen=5;
//////////
for (int i=0;i<len;i++)
{ kkk+=pbuf[i];
}
nLen=kkk.GetLength(); ///////nLen=len
//////////
}
...全文
27 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
Kiloy 2002-11-04
  • 打赏
  • 举报
回复
char s5[6];
for(int i=0;i<len;i+=5)
{
strncpy(s5,&pbuf[i],5);
s5[6]='\0';
//
// do your code here.
//
}
f26511314 2002-11-04
  • 打赏
  • 举报
回复
谢谢各位
我现在遇到这样一个问题:读取的数据放在pbuf中,假设
pbuf[len]="adfiljaspdfaspfdfjasfdjasjfjdasopdfasopfopasdagaggasdg";
我想在pbuf中从左依次取5个字符,直到取完为止,如果不用CString 改如何做呢
pikaqiu 2002-11-04
  • 打赏
  • 举报
回复
二进制文件缓冲不要使用CString,直接开Buffer最好
shiyongfan 2002-11-04
  • 打赏
  • 举报
回复
很同意iicup(双杯献酒)的说法,CString 类是用来处理字符串的,
像你这种数据应该用数组来存放,如果是图像的话可用动态的二
维数组来存。那样存取速度更快,处理更方便。而且0被作为了有
效数据。
BYTE *pBits=new BYTE[dwLengthOfBits];
另外,CString类分配的并不一定是连续的内存,这样会使处理速度
大幅度降低。
f26511314 2002-11-04
  • 打赏
  • 举报
回复
to :iicup(双杯献酒)

我现在要对读的数据进行编码处理,放在CString里面,可以依次取一段字符,直到取完为止,
双杯献酒 2002-11-04
  • 打赏
  • 举报
回复
这种数据直接放置在buffer中就很好,
为什么一定要放到CString里?
双杯献酒 2002-11-04
  • 打赏
  • 举报
回复
不要把这种数据放在CString的对象里。
因为数据中带有合法的有效数据'\0',而
它在CString里表示数据终止。
比如
CString str("XYZ\x00PPP");//数据中有'\0'
CString msg;
msg.Format("Length=%d\n\r",str.GetLength());
MessageBox(msg+str);

结果:
Length=3
XYZ

出错!

f26511314 2002-11-04
  • 打赏
  • 举报
回复
to :stonespace

kkk.ReleaseBuffer();
在对kkk.GetLength()还是等于5
ruihuahan 2002-11-04
  • 打赏
  • 举报
回复
up
stonespace 2002-11-04
  • 打赏
  • 举报
回复
用CString::GetBuffer/ReleaseBuffer
CString kkk;

len=cfile.GetLength();
pbuf = kkk.GetBuffer(len+1);
UINT nBytesRead = cfile.Read( pbuf,len);
cfile.Close();
pbuf[len]='\0';
kkk.ReleaseBuffer();

双杯献酒 2002-11-04
  • 打赏
  • 举报
回复
同意 zqone(zqone)
用二进制方式打开文件
cfile.Open(file,CFile::modeRead |CFile::shareDenyWrite ,&e)
修改为
cfile.Open(file,CFile::modeRead |CFile::shareDenyWrite|CFile::typeBinary,&e)
zqone 2002-11-04
  • 打赏
  • 举报
回复
你是以二进制方式读的文件吗?
phoenix_gao 2002-11-04
  • 打赏
  • 举报
回复
这句有问题:
kkk=pbuf;
改为:
kkk=*pbuf;
就应该对了
powerbamboo 2002-11-04
  • 打赏
  • 举报
回复
up
zhenxizhou 2002-11-04
  • 打赏
  • 举报
回复
gz
f26511314 2002-11-04
  • 打赏
  • 举报
回复
但是现在如果读bmp文件,pbuf=“BM2@|”,pbuf的长度是文件的大小,pbuf[i]在i>5以后都是空值了

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧