2013-05-26 68 views
1

我正在閱讀PDF文件,以二進制格式打開它。我必須通過套接字將每個字節發送到服務器。我爲此使用了winsock。以下就是我有問題的代碼:如何在二進制模式下讀取併發送CR/LF「x0D x0A」

int Div = (int)file_size/1024; 
int Mod = (int)file_size % 1024; 
for (int i=0; i<Div; i++) 
{ 
    file_block = new char[1024]; 
    myfile.seekg(i*1024); 
    myfile.get(file_block,1024); 
    send(theSocket,file_block,1024,0); 
} 
if (Mod != 0) 
{ 
    file_block = new char[Mod]; 
    myfile.seekg(Div*1024); 
    myfile.get(file_block,Mod); 
    send(theSocket,file_block,Mod,0); 
} 

當我閱讀PDF文件,我的程序讀取前4個字節後卡住,即%PDF-1.5。查看十六進制編輯器中的文件顯示有x0D x0A這是Carriage Return & Line Feed的十六進制表示。

這是由於我的程序卡住了原因。我怎麼解決這個問題 ?

+3

你有一個大的內存泄漏,因爲你在每個循環中分配內存,但從不釋放內存。 –

+0

請確保您在**連接的**兩端以二進制模式打開文件 –

+0

缺少重要的代碼,您不清楚如何打開文件。一定要使用ios :: binary,這樣就不會像文本文件那樣處理。 –

回答

3

如果您看到例如this reference你會看到get作用:

3)相同get(s, count, widen('\n')),也就是說,讀最多算1個字符,並將其存儲到字符串直到「\ n」發現指向秒。

所以開始它只會閱讀,直到換行。它只會讀取count - 1字符,在您的情況下1023而不是1024像您期望的那樣。

您應該使用read代替:

myfile.read(file_block, 1024); 

你或許應該檢查錯誤,以及,只發送,如果有沒有:

if (myfile.read(file_block, 1024)) 
    send(theSocket, file_block, myfile.gcount(), 0); 
else 
{ 
    // Error, handle it somehow 
} 
+3

另外,'send()'可能只發送一部分緩衝區,所以需要額外的循環。 –