ReadFile() 函数原型如下:
[C++] 纯文本查看 复制代码 BOOL WINAPI ReadFile(
开开椀渀 HANDLE hFile,
开开漀甀琀LPVOID lpBuffer,
开开椀渀 DWORD nNumberOfBytesToRead,
开开漀甀琀开漀瀀琀LPDWORD lpNumberOfBytesRead,
开开椀渀漀甀琀开漀瀀琀LPOVERLAPPED lpOverlapped
);
该函数从文件或输入/输出设备中读取数据。
第 1 个参数 hFile 是要读取的文件句柄,由 CreateFile()函数在用 GENERIC_READ 读取操作模式下获得。
第 2 个参数 lpBuffer 指向读取文件数据存储的内存缓冲区。
第 3 个参数 nNumberOfBytesToRead 指名需要从文件中读出的多少数据。
第 4 个参数 lpNumberOfBytesRead 表示实际读出的数据大小。这是因为,在读文件时,可能由于已经达到了文件末尾,此时被读取文件中所有数据大小小于指定要读取的字节数(nNumberOfBytesToRead)。如果设置该参数为 NULL ,那么只有当 第 5 个参数 lpOverlapped 为 NULL 时才可以。
第 5 个参数 lpOverlapped 是 OVERLAPPED 结构体指针,如果调用 CreateFile() 时设置了 FILE_FLAG_OVERLAPPED 标志,那么需要使用该参数,可以设置为 NULL 。
测试代码:
[C++] 纯文本查看 复制代码 #include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
猀攀琀氀漀挀愀氀攀(LC_ALL, "chs");
HANDLE hFileRead;
吀CHAR氀瀀FileDataBuffer[32];
DWORD搀眀刀攀愀搀攀搀匀椀稀攀 = 0;
娀攀爀漀Memory (lpFileDataBuffer, 32);
栀FileRead = CreateFile(argv[1],// 命令行中给出要读取的文件
GENERIC_READ,// 读方式打开文件
FILE_SHARE_READ,// 可共享读
一唀LL,// 默认安全设置
伀倀EN_EXISTING,// 只打开已存在的文件
FILE_ATTRIBUTE_NORMAL,// 常规文件属性
一唀LL );// 无模板
椀昀 (hFileRead == INVALID_HANDLE_VALUE) {
开琀瀀爀椀渀琀昀 (TEXT("打开文件失败: %d"), GetLastError());
爀攀琀甀爀渀 (-1);
紀
开琀瀀爀椀渀琀昀 (TEXT("========文件内容========\n"));
搀漀 {
椀昀 ( !ReadFile(hFileRead, lpFileDataBuffer, 30, &dwReadedSize, NULL) ) {
开琀瀀爀椀渀琀昀 (TEXT("读文件错误: %d\n"), GetLastError());
CloseHandle (hFileRead);
爀攀琀甀爀渀 (-2);
紀
开琀瀀爀椀渀琀昀 (TEXT("%s"), lpFileDataBuffer);
娀攀爀漀Memory (lpFileDataBuffer, 32);
紀 while (dwReadedSize);
CloseHandle (hFileRead);
爀攀琀甀爀渀 0;
}
运行输出:
[quote]D:\WinAPI\ReadFile\Debug>ReadFile.exe E:\新建文本文档2.txt
========文件内容========
?自2月9日起,济南市交警部门针对酒驾问题,出 台并实施抄告单位、追责同饮者、强制刑拘等一系列“新政”,并实名曝光了今年1月1日至1月31日查处的260名酒驾违法犯罪嫌疑人
名单。
对于酒后和醉酒驾驶者,济南市交警部门一律通过书信形式抄告其所在单位或者其居住地所属辖区办事处、派出所和安监部门。对经酒精检测仪检测确定为饮酒后驾驶的,现场制作询
问笔录和处罚决定书;凡是确认醉酒驾驶的就地约束至酒醒,并立即办理刑拘手续,不得取保候审。根据酒驾人员的相关信息,交警部门还将建立黑名单,同时提供给保监会。[quote]
注意,上面 E:\ 中的 新建文本文档.txt 是按照 Unicode 方式保存的,因为 VS2010 里默认就是使用 Unicode 方式处理文本的,即默认为 wchar_t 类型(2 个字节),所以用 _tprintf() 函数可正常打印中文。一般情况下,中文 Windows 的文本(比如用记事本编辑并默认保存的文本)默认保存方式为 ANSI (即默认编码为 GB2312 或 GBK ) ,如果读取这样方式保存的文本,那么上面的 _tprintf() 就要替换成 printf() 方能正确输出中文。
ReadFile() 函数并不只能读文本文件,设备文件,网络 socket 中也可使用该函数来读取数据。 |