ifstream sendFileStream;//文件流对象
sendFileStream.open(m_filepath);//打开文件
//封包发送
while(!sendFileStream.eof()){//文件未读取完
struct TCPPack a;//保存发送数据
struct TCPPack b;//保存接收数据
sendFileStream.read(a.data, 4096);//读取数据
int rendLen = sendFileStream.gcount();//获得读取长度
a.dwDalaLong = rendLen;
if (rendLen < 4096) {//是否最后一个数据包
a.EndFlag = 1;
}
send(m_sockClient, (char*)(&a), sizeof(a), 0);
cout <<"send packet dataLong: "<<a.dwDalaLong << endl;
recv(m_sockClient, (char*)(&b), sizeof(b), MSG_WAITALL);
cout << "data dwver:" << b.dwVerify << endl;
}
这是之前有问题的代码,对word格式文件进行读取的时候,总是无法正确读取信息。
百度找了很多文章,了解到一些知识。计算机文件分为二进制文件和纯文本文件(例如txt格式)
所以以上代码在传输txt文件时,无问题,传输图片格式也没有问题(这个没有去了解原因),当传输doc格式时,无法正确传输。
后又了解到,c++ io流打开文件的方式,默认文本文件方式打开,所以,需要指定打开方式,
常用的值如下:
ios::app: 以追加的方式打开文件
ios::ate: 文件打开后定位到文件尾,ios:app就包含有此属性
ios::binary: 以二进制方式打开文件,缺省的方式是文本方式。两种方式的区别见前文
ios::in: 文件以输入方式打开(文件数据输入到内存)
ios::out: 文件以输出方式打开(内存数据输出到文件)
ios::nocreate: 不建立文件,所以文件不存在时打开失败
ios::noreplace:不覆盖文件,所以打开文件时如果文件存在失败
ios::trunc: 如果文件存在,把文件长度设为0
ios::binary就是需要我们设置的
修改打开方式代码
sendFileStream.open(m_filepath,ios::binary|ios::in);//打开文件
运行正常。