CFile::Read之后,GetPosition返回值反而比Read之前的小。

The_eagles 2012-05-10 07:51:03
如题,在Read之前调用一次GetPosition(),记录值。Read之后再调用一次GetPosition返回值居然比记录的值小。

代码片段如下:

CLogFile 继承自CFile

CLogFile::ReadNextMessage()
{
DWORD dwPos1 = GetPosition(); // dwPos1==32120
BYTE val;
Read(&val, sizeof(val)) ; // 读取一个字节
DWORD dwPos2 = GetPosition(); // dwPos2==32115


随机出现 dwPos2 比dwPos1 小或者相等的情况。
随机出现读一个16字节的数据(SYSTEMTIME)后,Position只增加了12.
非常的诡异!

哪位高手能帮忙解答?多谢!
...全文
375 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
The_eagles 2012-05-11
  • 打赏
  • 举报
回复
原因已找到.

忘了说,是多线程程序。
线程1中只调用了Read,线程2中调用了GetPostion。
发现是CFile::GetPostion函数的问题,从名称上看天然无公害,实际上是一只披着羊皮的狼。

感谢大家!
jyh_baoding 2012-05-11
  • 打赏
  • 举报
回复
仔细调试运行
yuqangy 2012-05-10
  • 打赏
  • 举报
回复
Read之前文件指针是不是在你所期望的位置,这个要仔细调试一下
SONG_CA 2012-05-10
  • 打赏
  • 举报
回复
随机出现读一个16字节的数据(SYSTEMTIME)后,Position只增加了12,说明只读入了12个字节的有效数据,感觉你读入时候的长度控制还是有问题,查一下调用ReadNextMessage()函数的逻辑吧
  • 打赏
  • 举报
回复
我直接用CFile没发现你说的问题 是否是你派生时其他地方的错误导致
The_eagles 2012-05-10
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

不知你在开始读之前,是否定位到文件头了?要么就是你已经读到结尾了?
DWORD length = Read(&val, sizeof(val)) ; // 读取一个字节
看看length返回值是什么,确实很奇怪。
[/Quote]

读之前定位到文件头了,也没到文件尾。
每次Read返回值都做ASSERT检查了,没有问题。
关键是这个问题是随机出现的。。
苦恼中。。。
SONG_CA 2012-05-10
  • 打赏
  • 举报
回复
不知你在开始读之前,是否定位到文件头了?要么就是你已经读到结尾了?
DWORD length = Read(&val, sizeof(val)) ; // 读取一个字节
看看length返回值是什么,确实很奇怪。

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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