C++难题,向高手求教!!!急!急!急!

xdingy 2008-10-24 07:44:21
std::ios::pos_type logFilePtr = 0;
...
void statis()
{
std::ifstream fin(startTime.logPath.c_str());
...
fin.seekg(logFilePtr);
//read data
...
logFilePtr = fin.tellg();
}

整个程序前段都好使,可是突然出现个另我很费解的怪事:
(1)调试时发现当前logFilePtr = 19929
(2)接着往下读取数据正常
(3)但是当执行logFilePtr = fin.tellg();时发现logFilePtr = 19918

读取数据之后再取当前文件位置应该比19929大才对,怎么会比之小呢?
(而且前一段同样的操作是没有这种问题的)
...全文
152 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
xdingy 2008-10-24
  • 打赏
  • 举报
回复
想减都不好减,算了
谢谢楼上的老兄!
xdingy 2008-10-24
  • 打赏
  • 举报
回复
我把代码减一下后贴出来
xdingy 2008-10-24
  • 打赏
  • 举报
回复
输出还是19918
baihacker 2008-10-24
  • 打赏
  • 举报
回复
logFilePtr = fin.tellg(); 
fin >> hour >> seper >> min >> seper >> sec;
if(!fin || min != startTime.min)
break;
std::string ipstr;
std::string dmstr;
unsigned int flag = 3;
unsigned int index = 0;
bool insFinish = false;
fin >> flag >> ipstr >> dmstr;
logFilePtr = fin.tellg();

把logFilePtr输出看看...
xdingy 2008-10-24
  • 打赏
  • 举报
回复
弄不好,我只能用C的文件操作函数了,C++的文件流不知道怎么会出这么郁闷的问题
小于19929 的时候都好使,哎
用C函数ftell应该没有问题
xdingy 2008-10-24
  • 打赏
  • 举报
回复
项目中的一个模块
baihacker 2008-10-24
  • 打赏
  • 举报
回复
估计就是自己写着玩的吧...?
xdingy 2008-10-24
  • 打赏
  • 举报
回复
呵呵,估计很难看懂
xdingy 2008-10-24
  • 打赏
  • 举报
回复
void ReadAndStatis()
{
std::ifstream fin(startTime.logPath.c_str());
if(!fin)
return;

/*
** Create Hash Table.
*/
hashElem *hashTable = new hashElem[HASH_BUCKETS];
memset(hashTable, 0, sizeof(hashElem)*HASH_BUCKETS);
int total = 0;

while(fin)
{
//read log records from file
int hour = 0, min = 0, sec = 0;
char seper = ':';
fin.seekg(logFilePtr);
logFilePtr = fin.tellg();
fin >> hour >> seper >> min >> seper >> sec;
if(!fin || min != startTime.min)
break;
std::string ipstr;
std::string dmstr;
unsigned int flag = 3;
unsigned int index = 0;
bool insFinish = false;
fin >> flag >> ipstr >> dmstr;
logFilePtr = fin.tellg();
index = StrHash(dmstr.c_str()) % HASH_BUCKETS;
if(hashTable[index].head != NULL)
{
statisValue* pRecord = hashTable[index].head;
while(pRecord!= NULL)
{
if(pRecord->domainstr == dmstr && pRecord->flag == flag)
{
pRecord->ipmaps[ipstr] += 1;
pRecord->counts++;
insFinish = true;
break;
}
pRecord = pRecord->next;
}
}
if(!insFinish)
{
statisValue* temp = new statisValue;
temp->domainstr = dmstr;
temp->flag = flag;
temp->counts = 1;
temp->ipmaps[ipstr] += 1;
temp->next = hashTable[index].head;
if(flag == 3)
hashTable[index].doubtdm = EXIST;
else
hashTable[index].blackdm = EXIST;
hashTable[index].head = temp;
insFinish = true;
}
total++;
}
//...
}
baihacker 2008-10-24
  • 打赏
  • 举报
回复
(1)调试时发现当前logFilePtr = 19929
(2)接着往下读取数据正常
(3)但是当执行logFilePtr = fin.tellg();时发现logFilePtr = 19918

这段
xdingy 2008-10-24
  • 打赏
  • 举报
回复
代码挺大,主要功能是对日志进行分析,日志量很大,而且是实时的
所以采取每分钟统计一次,需要记住上次读取文件的位置,因此logFilePtr 就是这个作用
baihacker 2008-10-24
  • 打赏
  • 举报
回复
最好给个代码.

65,210

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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