设置文件指针的函数SetFilePointer的分析

7369 人浏览 | 时间: 2015-06-23 16:00:13 | 作者: codexia
    此函数用来设置文件指针的位置。有四个参数,依次是文件句柄、移动的距离低32位(LONG类型)、移动距离高32位,移动的起始位置。具体的含义请查询MSDN了解,在此只讲述让人迷惑不解的地方。
    我对一段数据进行两次的读写,并且是跳跃性的读取,因此就需要继续文件指针定位。在第一次读取时,使用此函数能够正确读出数据,可是第二次读取却是乱码。对地址等都再三检查,读取代码也正确无误,最后只有把焦点放在不太熟悉的SetFilePointer函数上面,然后查阅MSDN和验证,再仔细分析,才最终确定问题就是出在这个函数了。因为是测试,所以没有添加错误检验。虽然我在网上找到代码,运行后确实能够正确,但是引入了LARGE_INTEGER这个数据结构,如果照用,肯定是不会有错的,但是这个结构又会将问题复杂化。所以就进一步查MSDN,仔细分析和使用代码验证,最后只用简单的数据类型同样实现正确的读取,这样才找到问题的核心。经过假设和验证,证明假设是正确的。
    VS中,LONG类型占32位。如果一个文件很大,32位无法定位到表示范围之外的位置。这样设置文件指针,就超出表示范围而出问题。第二个参数是有符号数,有正负数之分。如果偏移量传给第二个参数来移动文件指针,如果正向偏移过大,传递给第二个参数,最高位则作为了符号位,结果将最高位的1解释成负数,从而函数内解释成反向移动文件指针,如果文件指针移动起始地址是FILE_BEGIN,则将文件指针移到文件开始的前面了。因而不是有效的移动,指针则不会移动。如果此时读取数据,则是从原来的位置开始读取,而不是从应该设置的
请微信扫码阅读。
为防止恶意爬虫,
已开启反爬机制,
理解哟~~~~
标注
评论
站内搜
百度搜
传送到手机
手机扫码,识别文字,完成传送x
加载中...
标注内容x
加载中...
添加标注x
收藏 0 点赞 0

相关阅读