C++ 是否没有GetFilePointer(Ex)Windows API函数?

C++ 是否没有GetFilePointer(Ex)Windows API函数?,c++,windows,winapi,visual-c++,file-pointer,C++,Windows,Winapi,Visual C++,File Pointer,我正在调试一个处理文件的程序。例如,我将文件指针设置为偏移量4(以0为基数),但它似乎是从偏移量5开始的 为了弄清楚发生了什么,我想输入一行来打印当前的文件指针(我没有在这个小项目中使用IDE,只使用Notepad2和命令行)。不幸的是,似乎没有Windows API函数来检索当前文件指针,只有一个函数来设置它 < >我记得在Pascal(DOS)中可以找到当前的文件指针,但是当前的文件指针如何在C++中在Windows中确定?< P>不同于大多数函数,它既提供了一个吸收器和设置器(在读写意义上

我正在调试一个处理文件的程序。例如,我将文件指针设置为偏移量4(以0为基数),但它似乎是从偏移量5开始的

为了弄清楚发生了什么,我想输入一行来打印当前的文件指针(我没有在这个小项目中使用IDE,只使用Notepad2和命令行)。不幸的是,似乎没有Windows API函数来检索当前文件指针,只有一个函数来设置它


< >我记得在Pascal(DOS)中可以找到当前的文件指针,但是当前的文件指针如何在C++中在Windows中确定?

< P>不同于大多数函数,它既提供了一个吸收器和设置器(在读写意义上),确实没有<代码> GETFILINTER指针或<代码> GETFILPOLINTINEX < /C> > 但是,可以通过调用来检索该值。两个
SetFilePointer
函数返回
SetFilePointer
的返回/输出,但您必须确保指定偏移量
0
文件当前
作为模式。这样,它从原来的位置移动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;
}

(记录在案,结果证明它工作正常;我只是使用了错误的测试文件。在我完成基于大小的模式测试后,我开始测试基于偏移量的模式,但忘记开始使用基于偏移量的测试文件而不是基于大小的测试文件。Doh!
›嫀
)两个实现都不包含错误处理。对于大于4GB的文件,第一个会自动失败。两者都不可取。在许多情况下,您事先知道文件的长度永远不会超过4GB。在本例中,代码是可以的。此外,这不是生产代码,它只是回答特定问题的示例。错误处理留给读者作为练习。