关闭文件句柄 fclose 会出错 求解 付上代码

hahanibc 2009-10-08 07:42:29
//将文件base64编码后发送

FILE* fp=fopen(m_attachment,"rb");
if(fp==NULL)
{
m_error=OPEN_FILE_ERROR;
return 0;
}


char buf [10001];
memset(buf,0,BUFFERSIZE+1);

char buf2[10001];
memset(buf2,0,BUFFERSIZE+1);
int readcount=0;
while(!feof(fp))
{
readcount=fread(buf,1,BUFFERSIZE,fp);
if(readcount>0)
{
base64(buf,buf2);
sprintf(m_sendbuff,"%s%s",buf2,"\r\n");
fclose(fp);
if(senddata()==0)
{
return 0;
}
memset(buf,0,BUFFERSIZE+1);
memset(buf2,0,BUFFERSIZE+1);
}
}
sprintf(m_sendbuff,"%s","\r\n");
if(senddata()==0)
{
return 0;
}
fclose(fp);
}


经过测试发现
执行sprintf(m_sendbuff,"%s%s",buf2,"\r\n");之后
fclose(fp);就会出错

如果 buf2是一个char *buf2 = new char [10001];
delete [] buf2;也和上边一样在sprintf后必出错
求解
...全文
636 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
hahanibc 2009-10-09
  • 打赏
  • 举报
回复
OK了 原来是BUFFERSIZE的问题
stjay 2009-10-08
  • 打赏
  • 举报
回复
BUFFERSIZE是多少?
>10000的话就会造成越界
fp被覆盖,fclose就出错
hahanibc 2009-10-08
  • 打赏
  • 举报
回复
返回0的话就代表发送失败

if(senddata()==0)
{
return 0; //返回前也没关闭啊
}

应该返回前关句柄。

但与这是问题好象没有关系。

hahanibc 2009-10-08
  • 打赏
  • 举报
回复
没写。
只读。
hahanibc 2009-10-08
  • 打赏
  • 举报
回复
sendbuff [10001];
aizibion 2009-10-08
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 aizibion 的回复:]
你以rb打开文件得,能写吗?
[/Quote]
m_sendbuff多大啊

if(senddata()==0)
{
return 0; //返回前也没关闭啊
}
aizibion 2009-10-08
  • 打赏
  • 举报
回复
你以rb打开文件得,能写吗?
hahanibc 2009-10-08
  • 打赏
  • 举报
回复
请高手帮忙看看
hahanibc 2009-10-08
  • 打赏
  • 举报
回复
请看2楼的问题
1楼作废 谢谢
hahanibc 2009-10-08
  • 打赏
  • 举报
回复
测试后的代码 发问题的时候忘记改回来

//将文件base64编码后发送

FILE* fp=fopen(m_attachment,"rb");
if(fp==NULL)
{
m_error=OPEN_FILE_ERROR;
return 0;
}


char buf [10001];
memset(buf,0,BUFFERSIZE+1);

char buf2[10001];
memset(buf2,0,BUFFERSIZE+1);
int readcount=0;
while(!feof(fp))
{
readcount=fread(buf,1,BUFFERSIZE,fp);
if(readcount>0)
{
base64(buf,buf2);
sprintf(m_sendbuff,"%s%s",buf2,"\r\n");
if(senddata()==0)
{
return 0;
}
memset(buf,0,BUFFERSIZE+1);
memset(buf2,0,BUFFERSIZE+1);
}
}
sprintf(m_sendbuff,"%s","\r\n");
if(senddata()==0)
{
return 0;
}
fclose(fp);
}



经过测试发现
执行sprintf(m_sendbuff,"%s%s",buf2,"\r\n");之后
fclose(fp);就会出错

如果 buf2是一个char *buf2 = new char [10001];
delete [] buf2;也和上边一样在sprintf后必出错
求解
xylicon 2009-10-08
  • 打赏
  • 举报
回复
//将文件base64编码后发送

FILE* fp=fopen(m_attachment,"rb");
if(fp==NULL)
{
m_error=OPEN_FILE_ERROR;
return 0;
}


char buf [10001];
memset(buf,0,BUFFERSIZE+1);

char buf2[10001];
memset(buf2,0,BUFFERSIZE+1);
int readcount=0;
while(!feof(fp))
{
readcount=fread(buf,1,BUFFERSIZE,fp);
if(readcount>0)
{
base64(buf,buf2);
sprintf(m_sendbuff,"%s%s",buf2,"\r\n");
fclose(fp);
if(senddata()==0)
{
return 0;
}
memset(buf,0,BUFFERSIZE+1);
memset(buf2,0,BUFFERSIZE+1);
}
}
sprintf(m_sendbuff,"%s","\r\n");
if(senddata()==0)
{
return 0;
}
fclose(fp);
}

你不是在上面已经close一次了吗。

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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