FTP下载文件后怎么将BUFF中的2进制信息存储在文件里

来源:百度知道 编辑:UC知道 时间:2024/06/22 02:26:11
使用VS2005编写了一个C++文件使用SOCKET将任何类型文件缓冲到buffer中怎么把信息存储在文件里
while(1)
{
ofstream outPutFile(fileName,ios::out|ios::app);
memset(buffer,NULL,4096);
int r = recv(socketData,buffer,4096,0);
outPutFile.write(buffer,strlen(buffer));
if (r < 0)
{
cout<<"recv error"<<endl;
closesocket(socketData);
return 1;
}
if (r == 0)
{
break;
closesocket(socketData);
}
}
接受一个rar文件长度 19000b
已经接收到4个4096b长度的BUffer和一个2616的buffer
可是写入的文件却只有1000多字节
文件写过之后文件名也变成了乱码
用winrar也打不开显示文件损坏
文件长度也不相等

受到的又不是字符串,你怎么用strlen取长度啊?
recv的返回值r就是收到的数据长度。
既然是二进制数据,就应该按二进制文件操作,不能按文本文件操作。

strlen 没问题 前面的代码也用了 结果没错 就算把strlen改为 4096 也不行
我的缓冲区长度是4096字节 要下载的文件长度是19000,我调试了下受到了19000的信息单不知怎么写到文件里

受到的又不是字符串,你怎么用strlen取长度啊?
recv的返回值r就是收到的数据长度。
既然是二进制数据,就应该按二进制文件操作,不能按文本文件操作。

收多少写多少不就可以了。strlen要出错啊,传的文件不是文档文件,那遇0的话长度计算不就错了嘛。写4096也不行啊,如果只读了1024长度,那多写给谁。

直接用r试试呢。
我存文件用的文件类,没用流操作- - (所以不太熟悉流),文件类每次读的时候要将指针移到文件的最后,以便不覆盖之前的。

你这个流操作有这功能吧- - 但是看你outPutFile是写在while循环里的,就是每次都要重新构造这个变量,那写入文件时写入的指针位置你是怎么操作的呢

以前做过这些,你buffer缓冲区一定,弄个循环写文件就ok了,
char buf[1024] = {0};
for(;;)
{
n=recSo.Receive(buf,1024); //接受
if(n==0) //0表示结束
break; //接受完毕
f.Write(buf,n);
temp+=n;
if(temp == flength)
{
return;
}
}
你可以参考下,