2012-02-19 497 views
0

我試圖將數據拆分爲小數據包。我不完全確定這個讀取方法是如何工作的,但是我已經給出了從文件中讀取的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

回答

0

在你的循環中,而不是假設它總是讀取一個完整的數據緩衝區,使用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