1 设置文件指针SetFilePointer
移动指定文件的文件指针。此函数将文件指针存储在两个LONG值中。要处理大于单个LONG值的文件指针,使用SetFilePointerEx函数更容易 。
DWORD SetFilePointer(
HANDLE hFile,
LONG lDistanceToMove,
PLONG lpDistanceToMoveHigh,
DWORD dwMoveMethod
);
1.1 参数介绍
(1)hFile:文件的句柄。必须使用GENERIC_READ或 GENERIC_WRITE访问权限创建文件句柄。
(2)lDistanceToMove:有符号值的低32位,用于指定移动文件指针的字节数。
如果lpDistanceToMoveHigh不是NULL, lpDistanceToMoveHigh和lDistanceToMove形成一个单一的 64 位有符号值,指定移动的距离。
如果lpDistanceToMoveHigh为NULL,则 lDistanceToMove是一个 32 位有符号值。为正值 lDistanceToMove向前移动文件指针在文件中,而负值移动文件指针回。
(3)lpDistanceToMoveHigh:指向要签名的64位距离的高32位的指针。
如果不需要高阶 32 位,则必须将此指针设置为NULL。当不为NULL 时,此参数还接收文件指针新值的高位 DWORD。
(4)dwMoveMethod:文件指针移动的起点。
此参数可以是以下值之一。
价值 | 意义 |
---|---|
FILE_BEGIN 0 | 起点为零或文件的开头。 |
FILE_CURRENT 1 | 起点是文件指针的当前值。 |
FILE_END 2 | 起点是当前的文件结束位置。 |
1.2 返回值
如果函数成功并且lpDistanceToMoveHigh为 NULL,则返回值是新文件指针的低位DWORD。 注意 如果函数返回的值不是INVALID_SET_FILE_POINTER,则对SetFilePointer的调用成功。您不需要调用GetLastError。
如果函数成功并且lpDistanceToMoveHigh不是 NULL,则返回值是新文件指针的低位DWORD并且lpDistanceToMoveHigh包含新文件指针的高位 DWORD。
详细请见:https://docs.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-setfilepointer
1.3 函数应用
#include<windows.h>
#include<tchar.h>
#include <iostream>
using namespace std;
typedef struct st_Person
{
TCHAR szName[20];
CHAR sex;
INT nAge;
}Person;
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdline, int nShowCmd)
{
//创建文件
HANDLE hFile = CreateFile("E:\\Project\\10_test\\文件指针测试.txt", GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ,
NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if(INVALID_HANDLE_VALUE == hFile)
{
MessageBox(NULL, "创建或打开文件失败", "Tip", MB_OK);
return 1;
}
//写入数字
int writeNum = 999;
DWORD dwWrite = 0;
BOOL bRet = WriteFile(hFile, &writeNum, sizeof(int), &dwWrite, NULL);
if(FALSE == bRet)
{
MessageBox(NULL, "写入数字失败", "Tip", MB_OK);
return 2;
}
//写入字符串
TCHAR szText[32] = "我在学习Windows程序设计";
bRet = WriteFile(hFile, szText, sizeof(szText), &dwWrite, NULL);
if(FALSE == bRet)
{
MessageBox(NULL, "写入字符串失败", "Tip", MB_OK);
return 3;
}
//写入二进制
Person p1;
memcpy(p1.szName, "lisi", sizeof("lisi"));
p1.sex = 'm';
p1.nAge = 55;
bRet = WriteFile(hFile, &p1, sizeof(Person), &dwWrite, NULL);
if(FALSE == bRet)
{
MessageBox(NULL, "写入二进制失败", "Tip", MB_OK);
return 4;
}
//将数据刷新到文件中
FlushFileBuffers(hFile);
//当前文件指针在文件末尾,因此需要设置文件指针的位置
//SetFilePointer(hFile, sizeof(int), NULL, FILE_BEGIN); //从文件其实位置
DWORD dwFilePionter = SetFilePointer(hFile, -sizeof(Person)-sizeof(szText), NULL, FILE_END); //从文件末尾位置
if(INVALID_SET_FILE_POINTER == dwFilePionter)
{
MessageBox(NULL, "设置文件指针失败", "Tip", MB_OK);
return 5;
}
//读取字符串
TCHAR szReadText[50];
DWORD dwRead = 0;
bRet = ReadFile(hFile, szReadText, 32, &dwRead, NULL);
if(FALSE == bRet)
{
MessageBox(NULL, "读取字符串失败", "Tip", MB_OK);
return 6;
}
return 0;
}