簡體   English   中英

C ++ ifstream.read; 讀取少於給定n個字節的字節

[英]C++ ifstream.read; reads bytes less then given n bytes

我正在嘗試將數據分成小包。 我不確定該讀取方法應如何工作,但我已指定要從文件讀取的512緩沖區大小。 但是,我得到的不是第一個數據包中的5個,而是得到512個。 其他則從0到512以上(不應發生)變化。

這是我要拆分的一個zip文件:在文本中,前幾個字節看起來像這樣

文本
(像字符一樣的de bucket實際上是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;
}

我現在只是測試直接讀寫。

在循環內部,不要假設它總是讀取完整的數據緩沖區,而應使用gcount()來查找實際讀取的數據量並傳輸那么多。

我覺得有義務補充一點:

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

我看起來很奇怪 不確定這是錯誤的,但也不是馬上就知道是對的(如果是對的,設計似乎有點奇怪)。

我還將跳過動態分配和刪除:

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

並改用std::vector<char>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM