fread 返回值

chrislin3217 2012-09-04 11:18:23
小弟写了个解析。cap文件的功能,解析到中间的时候发现fread的返回值先是小于要读取的值后来就总是小于0了,先贴上代码和文件出错时的二进制码,希望大侠们利用喝茶休息的时候帮我看看,给点建议,万分感激。

FILE *stream;
char szBuf[sizeof(pcap_file_header)];
memset(szBuf,0,sizeof(pcap_file_header));
size_t nRetRead = 0;



int nfile = m_strFilePath.ReverseFind('\\');
nfile = m_strFilePath.GetLength()-nfile-1;
CString strFile = m_strFilePath.Right(nfile);

if ((stream = fopen(strFile,"r+"))!=NULL)
{
fseek(stream,0,SEEK_SET);
fseek(stream,0,SEEK_END);
long longBytes= ftell(stream);
rewind(stream);

pcap_file_header pcapCheck;
nRetRead = fread(szBuf,1,sizeof(pcap_file_header),stream);

if (nRetRead == sizeof(pcap_file_header))
{
if (pcapCheck.magic != 3435973836)
{
MessageBox("This is not a .cap file");
return ;
}
}
// rewind(stream);
// fseek(stream,sizeof(pcap_file_header),SEEK_SET);
long loffset = sizeof(pcap_file_header);
if (loffset == sizeof(pcap_file_header))
{
HANDLE hThread;
DWORD dwThread;
hThread = CreateThread(NULL,0,MyThread,NULL,0,&dwThread);
if (hThread == NULL)
{
MessageBox("Create Thread faild !");
}
while(/*!feof(stream) && */loffset < longBytes)
{
PcapPacket pcappacket;
nRetRead = 0;
memset(&pcappacket,0,sizeof(PcapPacket));


try
{

nRetRead = fread(szBuf,1,sizeof(pcap_pkthdr),stream);
if (nRetRead !=sizeof(pcap_pkthdr))
{
int nTemp = sizeof(pcap_pkthdr) - nRetRead;

while(nTemp!=0)
{
nRetRead = fread(szBuf+nTemp,1,nTemp,stream);
if (nRetRead != nTemp)
{
nTemp -= nRetRead;
}
}
loffset+=sizeof(pcap_pkthdr);
}
else
loffset += nRetRead;


pcap_pkthdr* pheader = (pcap_pkthdr*)szBuf;
pcappacket.header.ts.tv_sec = pheader->ts.tv_sec;
pcappacket.header.ts.tv_usec = pheader->ts.tv_usec;
pcappacket.header.len = pheader->len;
pcappacket.header.caplen = pheader->caplen;
// rewind(stream);
// fseek(stream,loffset,SEEK_SET);

}
catch(...)
{
MessageBox("Read file error! ");
}
try
{
pcappacket.pkt_data = new u_char[pcappacket.header.caplen];
}
catch (...)
{
MessageBox("New u_char error! ");
}



try
{

nRetRead = fread(pcappacket.pkt_data,1,pcappacket.header.caplen,stream);
if (nRetRead != pcappacket.header.caplen)
{

int nTemp = pcappacket.header.caplen - nRetRead;
while(nTemp!=0)
{
nRetRead = fread(pcappacket.pkt_data+nTemp,1,nTemp,stream);
if (nRetRead != nTemp)
{
nTemp -= nRetRead;
}
}
loffset+=pcappacket.header.caplen;
}
else
loffset += nRetRead;
// rewind(stream);
// fseek(stream,loffset,SEEK_SET);
}
catch (...)
{
MessageBox("Read file error! ");
}

g_PcapPacketdeque_cs.Lock();
try
{
g_PcapPacketdeque.push_back(pcappacket);
}
catch (...)
{
MessageBox("g_PcapPacketdeque error! ");
}
g_PcapPacketdeque_cs.Unlock();
}
if (IsExit == TRUE)
{
CloseHandle(hThread);
}
MessageBox("Anlyze .cap file successfull!");
}

}
else
MessageBox("Open .cap file error");
if (stream!= NULL)
{
fclose(stream);
}

文件二进制码如下
...全文
379 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
mymtom 2012-09-04
  • 打赏
  • 举报
回复
文件数据看起来不是文本文件,在Windows下需要使用二进制打开
if ((stream = fopen(strFile,"r+"))!=NULL)
===>
if ((stream = fopen(strFile,"r+b"))!=NULL)
恨天低 2012-09-04
  • 打赏
  • 举报
回复

RETURN VALUES
Upon successful completion, fread() returns the number of
elements successfully read, which is less than nitems only
if a read error or end-of-file is encountered. If size or
nitems is 0, fread() returns 0 and the contents of the array
and the state of the stream remain unchanged. Otherwise, if
a read error occurs, the error indicator for the stream is
set and errno is set to indicate the error.

查下errno。
xmu_才盛 2012-09-04
  • 打赏
  • 举报
回复
用二进制的方式读16进制的数据,,
chrislin3217 2012-09-04
  • 打赏
  • 举报
回复
图片没传成功,汗!
7C 7C 61 AE 98 4F F5 0C 0B 00 26 01 00 00 26 01
00 00 00 90 8F 31 B3 67 00 14 38 EE 4A F6 08 00
45 00 01 18 4D 73 00 00 80 11 42 1A C0 A8 14 39
第一次从第二行的00 90 开始读取了25个字符,读到11 42的时候fread就一直返回为0了
proorck6 2012-09-04
  • 打赏
  • 举报
回复
好像fread中第二个参数,和第三个参数不能互换。
luguangxu68 2012-09-04
  • 打赏
  • 举报
回复
你可以先弄个简单的程序测试一下fread
赵4老师 2012-09-04
  • 打赏
  • 举报
回复
不要把
fopen("...","...");fscanf,fprintf,fclose //读时把\r\n替换成\n,写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待

fopen("...","...b");fread,fwrite,fclose //不作以上替换,遇到\x1a仍继续读;读写的内容当字节看待
弄混了

没看见11 42后面是1A吗?

69,336

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧