ReadFile()-----同步

ReadFile:从文件指针指向的位置开始将数据读出到一个文件中, 且支持同步和异步操作。与fread函数相比,这个函数要明显灵活的多。该函数能够操作通信设备、管道、套接字以及邮槽。

函数原型:
BOOL ReadFile
(
    HANDLE hFile,                                  
    LPVOID lpBuffer,                         
    DWORD nNumberOfBytesToRead,    
    LPDWORD lpNumberOfBytesRead,    
    LPOVERLAPPED lpOverlapped

);

参数说明:

HANDLE hFile 文件的句柄
需要读入数据的文件指针,这个指针指向的文件必须是GENERIC_READ 访问属性的文件。

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

DWORD nNumberOfBytesToRead 字节数
指定要读取的字节数。

LPDWORD lpNumberOfBytesRead 指向实际读取字节数的指针
指向一个DWORD类型变量的指针,用来接收读取的字节数。如果下一个参数为NULL,那么一定要传入这个参数。

LPOVERLAPPED lpOverlapped 结构体指针
文件打开时指定了FILE_FLAG_OVERLAPPED(FILE_FLAG_OVERLAPPED 允许对文件进行重叠操作),那么必须,用这个参数引用一个特殊的结构。
该结构定义了一次异步读取操作。否则,应将这个参数设为NULL

代码:
void ReadFile(char *str)
{
 HANDLE hFile;
 hFile = ::CreateFile(str, GENERIC_READ, 0, NULL, OPEN_EXISTING,
 FILE_ATTRIBUTE_NORMAL, NULL); //用这个函数比OpenFile好
 if(hFile == INVALID_HANDLE_VALUE)
 {
   MessageBox(NULL, "打开文件失败", "Error", MB_OK);
   CloseHandle((hFile); //一定注意在函数退出之前对句柄进行释放。
    return;
 }
 DWORD dwFileSize = GetFileSize(hFile , NULL);
 char *buffer = newchar[dwFileSize+1]; //最后一位为'\0',C-Style字符串的结束符。
 DWORD dwReadSize;
 ReadFile(hFile , buffer, dwFileSize, &dwReadSize, NULL);
 buffer[dwFileSize] = 0;
 MessageBox(NULL, buffer, "BufferSize", MB_OK);
 //善后工作
 delete[]buffer; //注意是delete[]而不是delete
 CloseHandle(hFile);//关闭句柄。
}

 

posted @ 2017-05-29 18:45  gd_沐辰  阅读(3350)  评论(0编辑  收藏  举报