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

C++ C++;ifstream.read;读取的字节数小于给定的n个字节,c++,binary,char,byte,ifstream,C++,Binary,Char,Byte,Ifstream,我正试图把数据分成小包。我不确定这个读取方法是如何工作的,但我给了512的缓冲区大小来读取文件。 但是我没有得到512,而是在我的第一包中得到了5。其他的变化范围从0到512以上(这不应该发生) 这是一个zip文件,我正在尝试拆分: 在文本中,前几个字节如下所示 (反桶字符实际上是2个字符) 它似乎应该抓取前5个字节,但之后只是停止并转到下一个读取块 因为它是一个512字节的缓冲区,所以前5个字节之后的所有内容都是垃圾。 我正在使用ifstream。模式设置为二进制 有什么建议吗 void F

我正试图把数据分成小包。我不确定这个读取方法是如何工作的,但我给了512的缓冲区大小来读取文件。 但是我没有得到512,而是在我的第一包中得到了5。其他的变化范围从0到512以上(这不应该发生)

这是一个zip文件,我正在尝试拆分: 在文本中,前几个字节如下所示


(反桶字符实际上是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;
}
void文件处理器::send()
{
//如果没有打开任何文件,请返回
如果(!\u file.is\u open())返回;
//将位置重置为开始位置
_seekg(0,ios::beg);
//结果缓冲区
字符*缓冲区;
char*partBytes=新字符[_bufferSize];
//读取文件并通过网络发送
while(_file.read(partBytes,_bufferSize))
{
buffer=Packet::create(Packet::FILE,partBytes);
Packet*p=Packet::create(缓冲区);
//cout printfhex(缓冲区,_bufferSize+数据包::HeaderSize);
//中断;

cout在循环中,不要假设它总是读取一个完整的数据缓冲区,而是使用
gcount()
查找它实际读取的数据量,并传输这些数据量

我觉得有必要补充一点:

    buffer = Packet::create(Packet::FILE,partBytes);
    Packet *p = Packet::create(buffer);
我觉得很奇怪。不确定它是否错了,但也不清楚它是否正确(如果它是对的,设计似乎有点奇怪)

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

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

使用std::vector来代替。

很难提出任何建议,因为您还没有显示正在使用的代码。
\u file.gcount()
返回上次读取的字节数,而不是剩余的字节数。此外,如果文件中的缓冲区大小小于
\u bufferSize
字节,则永远不会输入
while
。请阅读文档,了解您使用的方法,其中正在处理的是1.5 mb。while肯定已输入。数据包的缓冲区是直接传输的rsion测试它是否工作。稍后我将删除它并将其发送到网络组件。