ReadFile 函数

函数原型   BOOL ReadFile(

  HANDLE hFile, //文件的句柄

  LPVOID lpBuffer, //用于保存读入数据的一个缓冲区

  DWORD nNumberOfBytesToRead, //要读入的字符数

  LPDWORD lpNumberOfBytesRead, //指向实际读取字节数的指针

  LPOVERLAPPED lpOverlapped //如文件打开时指定了FILE_FLAG_OVERLAPPED,那么必须,用这个参数引用一个特殊的结构。该结构定义了一次异步读取操作。否则,应将这个参数设为NULL

  );

功能说明

  从文件指针指向的位置开始将数据读出到一个文件中, 且支持同步和异步操作,

  如果文件打开方式没有指明FILE_FLAG_OVERLAPPED的话,当程序调用成功时,它将实际读出文件的字节数保存到lpNumberOfBytesRead指明的地址空间中

  如果文件要交互使用的话,当函数调用完毕时要记得调整文件指针

参数说明

  HANDLE hFile, 需要写入数据的文件指针,这个指针指向的文件必须是GENERIC_READaccess 访问属性的文件

  LPOVERLAPPED lpOverlapped OVERLAPPED结构体指针,如果文件是以FILE_FLAG_OVERLAPPED方式打开的话,那么这个指针就不能为NULL

返回值

  调用成功,返回非0

  调用不成功,返回为0

应用实例

  void ReadFile(char* str)

  {

  HANDLE pfile;

  pfile = ::CreateFile(str,GENERIC_READ,0,NULL,OPEN_EXISTING,

  FILE_ATTRIBUTE_NORMAL|FILE_FLAG_DELETE_ON_CLOSE,NULL); // 用这个函数比OpenFile好

  if ( pfile == INVALID_HANDLE_VALUE)

  {

  MessageBox( NULL,"打开文件失败" ,"Error",MB_OK);

  CloseHandle(pfile); // 一定注意在函数退出之前对句柄进行释放

  return;

  }

  DWORD filesize=GetFileSize(pfile,NULL);

  char* buffer=new char[filesize+1]; // 最后一位为 '/0',C-Style 字符串的结束符

  DWORD readsize;

  ReadFile(pfile,buffer,filesize,&readsize,NULL);

  buffer[filesize]=0;

  MessageBox(BULL,buffer,"Buffer Size",MB_OK);

  // 善后工作

  delete[] buffer; // 注意是delete[] 而不是 delete

  CloseHandle(pfile); // 关闭句柄

  }

<think>我们正在讨论C++中ReadFile函数的使用方法。根据用户的问题,我们需要提供ReadFile函数的使用指南。注意,ReadFile是Windows API的一部分,用于从文件(包括串行端口、管道等)读取数据。 参考引用[1]中提到了在Windows平台上打开串行端口、配置参数、发送和接收数据,其中接收数据部分就使用了ReadFile函数。引用[2]也提到了RS232通信中ReadFile的使用。 因此,我们可以结合这些信息,并扩展成详细的ReadFile使用指南。 步骤: 1. 介绍ReadFile函数的基本信息(功能、位置、参数等) 2. 详细说明每个参数的含义和用法 3. 提供使用示例(包括错误处理) 4. 注意事项 注意:由于用户要求使用中文,并且需要按照系统级指令格式化数学表达式(但这个问题可能不涉及数学表达式,所以主要关注代码和文字说明)。 另外,根据要求,我们需要在最后生成相关问题。 开始回答:</think>### C++ ReadFile 函数使用指南 `ReadFile` 是 Windows API 提供的文件读取函数,用于从文件、管道、串行端口等设备读取数据。其函数原型如下: ```cpp BOOL ReadFile( HANDLE hFile, // 文件/设备句柄 LPVOID lpBuffer, // 接收数据的缓冲区 DWORD nNumberOfBytesToRead, // 要读取的字节数 LPDWORD lpNumberOfBytesRead, // 实际读取的字节数 LPOVERLAPPED lpOverlapped // 异步操作结构指针(同步操作可置NULL) ); ``` #### 参数详解 1. **hFile** 通过 `CreateFile` 打开的有效句柄,例如串行端口句柄[^2]: ```cpp HANDLE hCom = CreateFile("COM1", GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL); ``` 2. **lpBuffer** 接收数据的缓冲区指针,需预先分配内存: ```cpp char buffer[256]; // 静态缓冲区 // 或动态分配 BYTE* pBuffer = new BYTE[1024]; ``` 3. **nNumberOfBytesToRead** 指定最大读取字节数,不得超过缓冲区容量: ```cpp DWORD bytesToRead = sizeof(buffer); ``` 4. **lpNumberOfBytesRead** 输出参数,返回实际读取的字节数: ```cpp DWORD bytesRead = 0; ``` 5. **lpOverlapped** 同步操作设为 `NULL`;异步操作需传递 `OVERLAPPED` 结构体指针。 #### 同步读取示例 ```cpp HANDLE hFile = CreateFile("test.txt", GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (hFile == INVALID_HANDLE_VALUE) { // 错误处理 } char buffer[128]; DWORD bytesRead; BOOL success = ReadFile(hFile, buffer, sizeof(buffer), &bytesRead, NULL); if (success && bytesRead > 0) { // 处理数据:buffer[0] 到 buffer[bytesRead-1] } else { DWORD error = GetLastError(); // 错误处理(如 ERROR_IO_PENDING 等) } CloseHandle(hFile); // 关闭句柄 ``` #### 错误处理关键点 1. **返回值检查** - 返回 `TRUE`:读取成功,检查 `bytesRead` 获取实际数据长度 - 返回 `FALSE`:调用 `GetLastError()` 获取错误代码: ```cpp if (!success) { DWORD err = GetLastError(); if (err == ERROR_HANDLE_EOF) { // 文件已读完 } } ``` 2. **超时控制** 对串行端口等设备需设置超时[^2]: ```cpp COMMTIMEOUTS timeouts = {0}; timeouts.ReadIntervalTimeout = 50; // 毫秒 SetCommTimeouts(hCom, &timeouts); ``` #### 注意事项 1. **缓冲区生命周期** 确保缓冲区在读取期间有效(静态/动态分配内存勿提前释放)。 2. **同步与异步模式** - 同步模式:函数阻塞直到操作完成 - 异步模式:需配合 `OVERLAPPED` 和 `WaitForSingleObject` 3. **句柄权限** 使用 `CreateFile` 打开句柄时需包含 `GENERIC_READ` 权限。 4. **读取位置** 文件读取位置由当前文件指针决定,可通过 `SetFilePointer` 调整。 ---
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值