C++ ifstream.read;读取字节少于给定的n个字节

问题描述:

我试图将数据拆分为小数据包。我不完全确定这个读取方法是如何工作的,但是我已经给出了从文件中读取的512的缓冲区大小。 但我没有得到512我只是得到5我的第一个数据包。其他人从0到512以上(这不应该发生)。C++ ifstream.read;读取字节少于给定的n个字节

它我试图分裂出一个zip文件: 在文本中的第几个字节这个样子

text
(如字符德斗实际上是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; 
} 

我只是现在正在测试直接读写。

+1

我们不能没有代码 – 2012-02-19 18:03:04

+0

很难提出任何建议,因为你没有显示你正在使用的代码。 – 2012-02-19 18:03:11

+0

'_file.gcount()'返回上次读取的字节数,而不是剩下多少字节。如果文件中的字节数小于_bufferSize字节,则不会输入“while”。请阅读使用 – 2012-02-19 18:11:49

在你的循环中,而不是假设它总是读取一个完整的数据缓冲区,使用gcount()来查找它实际读取的数量,并发送那么多。

我觉得有必要补充一点:

buffer = Packet::create(Packet::FILE,partBytes); 
    Packet *p = Packet::create(buffer); 

看起来很奇怪,我。不知道它是错误的,但它不是很明显,它也是正确的(如果它是正确的,设计看起来有点奇怪)。

我还跳过动态分配和删除:

char * partBytes = new char[_bufferSize]; 
// ... 
delete [] partBytes; 

,并使用std::vector<char>代替。

+0

数据包缓冲区是一个直接转换来测试它是否工作。稍后,我将删除它并将其发送到网络组件。 – Sidar 2012-02-19 18:15:28