1 文件的读取ReadFile
从指定的文件或输入/输出 (I/O) 设备读取数据。如果设备支持,读取发生在文件指针指定的位置。
BOOL ReadFile(
HANDLE hFile,
LPVOID lpBuffer,
DWORD nNumberOfBytesToRead,
LPDWORD lpNumberOfBytesRead,
LPOVERLAPPED lpOverlapped
);
1.1 参数介绍
(1)hFile:设备句柄(例如,文件、文件流、物理磁盘、卷、控制台缓冲区、磁带驱动器、套接字、通信资源、邮槽或管道)。该HFILE参数必须已经具有读取权限创建。
(2)lpBuffer:指向接收从文件或设备读取的数据的缓冲区的指针。该缓冲区必须在读操作期间保持有效。在读取操作完成之前,调用者不得使用此缓冲区。
(3)nNumberOfBytesToRead:要读取的最大字节数。
(4)lpNumberOfBytesToRead:一个指向接收使用同步hFile参数时读取的字节数的变量的指针 。
(5)lpOverlapped:
如果hFile参数是用FILE_FLAG_OVERLAPPED打开的, 则需要指向OVERLAPPED结构的指针,否则它可以是NULL。如果hFile使用FILE_FLAG_OVERLAPPED打开,则 lpOverlapped参数必须指向有效且唯一的OVERLAPPED结构,否则函数会错误地报告读取操作已完成。
1.2 返回值
如果函数成功,则返回值为非零 ( TRUE )。
如果函数失败,或正在异步完成,则返回值为零 ( FALSE )。要获取扩展错误信息,请调用 GetLastError函数。
2 文件的写入WriteFile
将数据写入指定的文件或输入/输出 (I/O) 设备。
BOOL WriteFile(
HANDLE hFile,
LPCVOID lpBuffer,
DWORD nNumberOfBytesToWrite,
LPDWORD lpNumberOfBytesWritten,
LPOVERLAPPED lpOverlapped
);
2.1 参数介绍
(1)hFile:文件或 I/O 设备的句柄(例如,文件、文件流、物理磁盘、卷、控制台缓冲区、磁带驱动器、套接字、通信资源、邮槽或管道)。该HFILE参数必须以写访问创建的。
(2)lpBuffer:指向包含要写入文件或设备的数据的缓冲区的指针。该缓冲区必须在写操作期间保持有效。在写操作完成之前,调用者不得使用此缓冲区。
(3)nNumberOfBytesToWrite:要写入文件或设备的字节数。
(4)lpNumberOfBytesWritten:一个指向接收使用同步hFile参数时写入的字节数的变量的指针 。
(5)lpOverlapped:如果hFile参数是用FILE_FLAG_OVERLAPPED打开的, 则需要指向OVERLAPPED结构的指针,否则该参数可以为 NULL。
2.2 返回值
如果函数成功,则返回值为非零 ( TRUE )。
如果函数失败,或正在异步完成,则返回值为零 ( FALSE )。要获取扩展错误信息,请调用 GetLastError函数。
3 函数应用
#include <windows.h>
#include <tchar.h>
#include <iostream>
using namespace std;
struct Student
{
int age;
char sex;
char szName[32];
};
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
HANDLE hFile = CreateFile("E:\\Project\\09_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);
}
//写入文件
//写入数字
int n = 339;
DWORD dwRealWrite = 0;
BOOL bRet = WriteFile(hFile, &n, sizeof(int), &dwRealWrite, NULL);
if(bRet)
{
MessageBox(NULL, "数据写入成功", "Tip", MB_OK);
}
else
{
MessageBox(NULL, "数据写入失败", "Tip", MB_OK);
}
//写入字符
char ch = 'm';
bRet = WriteFile(hFile, &ch, sizeof(char), &dwRealWrite, NULL);
if(bRet)
{
MessageBox(NULL, "数据写入成功", "Tip", MB_OK);
}
else
{
MessageBox(NULL, "数据写入失败", "Tip", MB_OK);
}
//写入字符串
TCHAR szText[32] = "Windows程序设计!";
bRet = WriteFile(hFile, szText, sizeof(szText), &dwRealWrite, NULL);
if(bRet)
{
MessageBox(NULL, "数据写入成功", "Tip", MB_OK);
}
else
{
MessageBox(NULL, "数据写入失败", "Tip", MB_OK);
}
//写入二进制文件
Student stud1;
stud1.age = 22;
stud1.sex = 'm';
memcpy(stud1.szName, "zhangsan", sizeof("zhangsan"));
bRet = WriteFile(hFile, &stud1, sizeof(Student), &dwRealWrite, NULL);
if(bRet)
{
MessageBox(NULL, "数据写入成功", "Tip", MB_OK);
}
else
{
MessageBox(NULL, "数据写入失败", "Tip", MB_OK);
}
//关闭文件
CloseHandle(hFile);
//打开文件
hFile = CreateFile("E:\\Project\\09_test\\读写测试.txt", GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if(INVALID_HANDLE_VALUE == hFile)
{
MessageBox(NULL, "打开文件失败", "Tip", MB_OK);
}
//读取文件
//(1)读取数字
int readNum = 0;
DWORD dwRealRead;
bRet = ReadFile(hFile, &readNum, sizeof(int), &dwRealRead, NULL);
if(FALSE == bRet)
{
MessageBox(NULL, "读取数字失败", "Tip", MB_OK);
}
//(2)读取字符
char readCh;
bRet = ReadFile(hFile, &readCh, sizeof(char), &dwRealRead, NULL);
if(FALSE == bRet)
{
MessageBox(NULL, "读取字符失败", "Tip", MB_OK);
}
//(3)读取字符串
TCHAR szReadText[32] = {0};
bRet = ReadFile(hFile, szReadText, sizeof(szReadText), &dwRealRead, NULL);
if(FALSE == bRet)
{
MessageBox(NULL, "读取字符串失败", "Tip", MB_OK);
}
//读取二进制
Student stud2;
bRet = ReadFile(hFile, &stud2, sizeof(Student), &dwRealRead, NULL);
if(FALSE == bRet)
{
MessageBox(NULL, "读取二进制失败", "Tip", MB_OK);
}
return 0;
}