【发布时间】:2012-03-10 05:40:12
【问题描述】:
我正在尝试将数据拆分为小数据包。我不确定这个读取方法是如何工作的,但是我给了一个 512 的缓冲区大小来从文件中读取。 但是我没有得到 512,而是在我的第一个数据包中得到 5。其他从 0 到 512 以上不等(这不应该发生)。
这是一个我正在尝试拆分的 zip 文件: 在文本中,前几个字节如下所示
(de bucket like characters其实是2个字符)
它似乎应该抓取前 5 个字节,但之后只是停止并转到下一个读取块。
因为它是一个 512 的缓冲区,所以前 5 个字节之后的所有内容都是垃圾。 我正在使用ifstream。并且模式设置为二进制。
有什么建议吗?
void FileProcessor::send()
{
//If no file is opened return
if(!_file.is_open()) return;
//Reset position to beginning
_file.seekg(0, ios::beg);
//Result buffer
char * buffer;
char * partBytes = new char[_bufferSize];
//Read the file and send it over the network
while (_file.read(partBytes, _bufferSize))
{
buffer = Packet::create(Packet::FILE,partBytes);
Packet *p = Packet::create(buffer);
//cout << strlen(partBytes);
//p->PrintHex(buffer,_bufferSize+Packet::HeaderSize);
//break;
cout << "Normal size : \t" << strlen(partBytes)<< "\tPacketSize: \t" << p->getLength()<<"\n";
//cout << strcmp(p->getData().c_str(),partBytes) << "\n";
writeToFile(p->getData().c_str(),p->getData().length());
delete p;
}
//Write final bytes if any
if(_file.gcount())
{
//writeToFile(partBytes, _file.gcount());
buffer = Packet::create(Packet::FILE,partBytes);
Packet *p = Packet::create(buffer);
writeToFile(p->getData().c_str(),p->getData().length());
//cout << p->getLength() << "\n";
delete p;
}
//cout<< *p << "\n";
delete [] partBytes;
}
我现在只是测试直接读写。
【问题讨论】:
-
很难提出任何建议,因为您没有显示您正在使用的代码。
-
_file.gcount()返回上次读取的字节数,而不是剩余的字节数。此外,如果文件中的字节数少于_bufferSize,则永远不会输入while。阅读您正在使用的方法的文档 -
正在处理 1.5 mb。 while 肯定是输入的。
标签: c++ binary char byte ifstream