文件的读取和写入

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函数。

注意  该GetLastError函数代码 ERROR_IO_PENDING还不是一个失败者; 它指定读取操作正在异步等待完成。

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函数。

注意  该GetLastError函数代码 ERROR_IO_PENDING还不是一个失败者; 它指定写操作异步等待完成。
 

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;
}
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值