我正在以二进制格式二进制格式打开PDF文件。我必须通过套接字将每个字节发送到服务器。我正在为此目的使用winsock。以下是我遇到问题的代码:
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
的十六进制表示。
这是我的程序卡住的原因吗?我该如何解决这个问题?
答案 0 :(得分:3)
如果您看到例如this reference您会看到get
:
3)与
get(s, count, widen('\n'))
相同,即读取最多count-1个字符并将它们存储到s指向的字符串中,直到找到'\ 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
}