我正在尝试调试一个操作文件的程序。例如,我将文件指针设置为偏移量 4(使用基数 0),但它似乎是从偏移量 5 开始。
为了弄清楚发生了什么,我想输入一行来打印当前文件指针(我没有在这个小项目中使用 IDE,只是使用 Notepad2 和命令行)。不幸的是,似乎没有 Windows API 函数来检索当前文件指针,只有一个可以设置它。
我记得可以在Pascal(DOS中)中找到当前文件指针,但是在Windows中的C++中如何确定当前文件指针?
与大多数同时提供 getter 和 setter(在读写意义上)的函数不同,确实没有
GetFilePointer
或 GetFilePointerEx
。
(Ex)
来检索值。两个
SetFilePointer
函数返回 SetFilePointer
的返回/输出,但您必须确保指定 0
、 和 FILE_CURRENT
的偏移量作为模式。这样,它从原来的位置移动 0 个字节,然后返回(我不能保证它是否浪费 CPU 周期和 RAM 来执行零移动,但我认为他们已经优化为不这样做)。
是的,它不一致且令人困惑(而且冗余且设计不佳),但您可以将其包装在您自己的
GetFilePointer(Ex)
函数中:
DWORD GetFilePointer (HANDLE hFile) {
return SetFilePointer(hFile, 0, NULL, FILE_CURRENT);
}
LONGLONG GetFilePointerEx (HANDLE hFile) {
LARGE_INTEGER liOfs={0};
LARGE_INTEGER liNew={0};
SetFilePointerEx(hFile, liOfs, &liNew, FILE_CURRENT);
return liNew.QuadPart;
}
由于多年来没有人愿意为@Synetech 发布的基本功能答案发布“固定”解决方案,所以我决定这样做。下面是两个实现,在使用上大致符合相关的SetFilePointer方法,由消费者决定是否关心大于4GB的文件并进行相关的错误处理。
DWORD GetFilePointer(HANDLE hFile, OUT PLONG lpFilePointerHigh)
{
if (lpFilePointerHigh != NULL)
{
/* Ensure lpFilePointerHigh is zero */
*lpFilePointerHigh = 0;
}
return SetFilePointer(hFile, 0, lpFilePointerHigh, FILE_CURRENT);
}
BOOL GetFilePointerEx(HANDLE hFile, OUT PLARGE_INTEGER lpFilePointer)
{
const LARGE_INTEGER liOfs = { };
if (lpFilePointer != NULL)
{
/* Ensure lpFilePointer is zero */
lpFilePointer->QuadPart = 0;
}
return SetFilePointerEx(hFile, liOfs, lpFilePointer, FILE_CURRENT);
}