【问题标题】:C++ ifstream.read; reads bytes less then given n bytesC++ ifstream.read;读取的字节少于给定的 n 个字节
【发布时间】: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


【解决方案1】:

在您的循环中,不要假设它总是读取完整的数据缓冲区,而是使用gcount() 来查找它实际读取的数量,然后传输那么多。

我觉得有必要补充一下:

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

对我来说看起来很奇怪。不确定是不是错了,但也不是很明显它是对的(如果是对的,设计看起来有点奇怪)。

我也会跳过动态分配和删除:

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

改用std::vector&lt;char&gt;

【讨论】:

  • 缓冲区和Packet是直接转换来测试是否有效。稍后我将删除它并将其发送到网络组件。
猜你喜欢
  • 2020-06-12
  • 1970-01-01
  • 2015-02-17
  • 1970-01-01
  • 1970-01-01
  • 2020-10-20
  • 2012-01-24
  • 2021-07-16
  • 2011-12-08
相关资源
最近更新 更多