奇怪的CString::ReleaseBuffer()错误

afterruins 2010-02-26 01:48:28
读文件到CString中去

CString asmStr;
FILE* pFile=fopen(filename,"r+b");
long fsize = _filelength(fileno(pFile));
fseek(pFile,0,SEEK_SET);
fread(asmStr.GetBuffer(fsize),fsize,1,pFile);
asmStr.ReleaseBuffer();

最后出了一个断言错误 nlength<=getdata()->nalloclength

清大家帮忙看看!谢谢!
...全文
402 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
副组长 2010-02-26
  • 打赏
  • 举报
回复
CFile f;
f.Open(fileName,CFile::modeRead);
int n = f.GetLength();
char* temp = new char[n+1];
f.Read(temp,n);
temp[n] = 0;
asmStr = temp;
delete [] temp;

反正我是从来不往CString里面直接灌数据,如果需要用GetBuffer也不要给他指定长度,这样可以获得整个长度,release的时候就不出问题了。
你上面的temp[fsize-1]='\0'; 吃掉以一个字符。


WizardK 2010-02-26
  • 打赏
  • 举报
回复
引用 8 楼 afterruins 的回复:
谢谢WizardK,我还是有点问题,你能再帮我看看么?
你说的非文本信息,是不是就是指的'\0'这样的信息?
那long fsize = _filelength(fileno(pFile)); 我这个fsize算进去'\0'这个的大小了么?

就算没算进去的话fread(asmStr.GetBuffer(fsize),fsize,1,pFile); 我已经指定大小了,

为什么最后ReleaseBuffer里算出的会大一点呢?


非文本信息是指组成不是都有可见字符组成的。
fsize是找到文件的EOF为结尾,中间当然会包含0X00。
建议你这种缓冲分配还是不要用CSTRING了,效率低。
afterruins 2010-02-26
  • 打赏
  • 举报
回复
恩,谢谢各位大大了,有点感觉了,占时用这个方法吧,可能是releasebuffer里计算长度是需要‘\0’。
char* temp=asmStr.GetBuffer(fsize);

fread(temp,fsize,1,pFile);
temp[fsize-1]='\0';
asmStr.ReleaseBuffer();
zhiweikongfu 2010-02-26
  • 打赏
  • 举报
回复
引用 6 楼 magic7004 的回复:
不知道啊,我这样用OK的啊。
难道是楼主的文件的问题?


Me too
cpp2017 2010-02-26
  • 打赏
  • 举报
回复
3000多个字节,我的示列只分配100个字节,肯定不够长.

huziwu 2010-02-26
  • 打赏
  • 举报
回复
如果你用CString,那么你申请的空间为fsize,当文件最后一个字节不等于‘\0’时,那么CString就没有字符串结束符号了。
CString asmStr;
char *ptr = asmStr.GetBuffer(fsize+1);
memset(ptr,0,fsize+1);
fread(ptr,fsize,1,pFile);
asmStr.ReleaseBuffer();
afterruins 2010-02-26
  • 打赏
  • 举报
回复
3000多个字节

我觉得很奇怪啊,我只读进去fsize个字节的东西啊!fsize后面的东西是哪来的,况且getbuffer只给fsize的大小,怎么又变大了?
cpp2017 2010-02-26
  • 打赏
  • 举报
回复
最后我还是用的这种笨办法做的!
这个方法不笨.

====你的文件有多长?
afterruins 2010-02-26
  • 打赏
  • 举报
回复
最后我还是用的这种笨办法做的!
char* temp;
temp=(char*)malloc(fsize);
fread(temp,fsize,1,pFile);
//asmStr.ReleaseBuffer();
temp[fsize-1]='\0';
asmStr=temp;
free(temp);
但是我很想知道为why!
望高人指点!
会飞的老鱼 2010-02-26
  • 打赏
  • 举报
回复
是fread(asmStr.GetBuffer(fsize),fsize,1,pFile); 这一行出错了,msdn指出的fread函数的第一个参数是void*类型的,当定义char*型指针,然后new内存空间的方法调用fread函数就会发生错误。
自己网上查下相关文章吧。
afterruins 2010-02-26
  • 打赏
  • 举报
回复
谢谢WizardK,我还是有点问题,你能再帮我看看么?
你说的非文本信息,是不是就是指的'\0'这样的信息?
那long fsize = _filelength(fileno(pFile)); 我这个fsize算进去'\0'这个的大小了么?

就算没算进去的话fread(asmStr.GetBuffer(fsize),fsize,1,pFile); 我已经指定大小了,

为什么最后ReleaseBuffer里算出的会大一点呢?
cpp2017 2010-02-26
  • 打赏
  • 举报
回复
如果是文本文件,分配的空间要足够长,最好不要用CString
magic7004 2010-02-26
  • 打赏
  • 举报
回复
不知道啊,我这样用OK的啊。
难道是楼主的文件的问题?
WizardK 2010-02-26
  • 打赏
  • 举报
回复
"r+b"方式读,中间包含非文本信息,致使你的缓冲内部是NULL结尾的字符串,而调用时又是按照默认的参数-1执行的。建议你读取非文本信息时不要用CString。

void ReleaseBuffer(
int nNewLength = -1
);
Parameter
nNewLength
The new length of the string in characters, not counting a null terminator. If the string is null terminated, the -1 default value sets the CSimpleStringT size to the current length of the string.

如果只是字符串,可以如下做

LPTSTR p = s.GetBuffer( XXX );
s.ReleaseBuffer( ); // Surplus memory released, p is now invalid.
afterruins 2010-02-26
  • 打赏
  • 举报
回复
大家帮忙看看啊,到底是怎么回事啊,怎么
void ReleaseBuffer( int nNewLength = -1 )
{
if( nNewLength == -1 )
{
nNewLength = StringLength( m_pszData );
}
SetLength( nNewLength );
}

nNewLength 算出来,比fsize大13个字节呢?
afterruins 2010-02-26
  • 打赏
  • 举报
回复
楼上的方法么用啊,

是在asmStr.ReleaseBuffer();出错

跟进去发现ReleaseBuffer 中 CString重新计算缓冲区的大小,比我规定的fsize大13个字节
cpp2017 2010-02-26
  • 打赏
  • 举报
回复
CString asmStr('\0',100);

FILE* pFile=fopen(_T("d:\\aa.txt"),"r+b");
long fsize = _filelength(fileno(pFile));
fseek(pFile,0,SEEK_SET);
fread(asmStr.GetBuffer(fsize),fsize,1,pFile);
asmStr.ReleaseBuffer();
fclose(pFile);
WizardK 2010-02-26
  • 打赏
  • 举报
回复
是在asmStr.ReleaseBuffer(); 这行报的错吗?

16,472

社区成员

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

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

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