2.5 茴字的N种写法
在Visual C++(www.cppentry.com)世界里,对于每一种需求,几乎都存在着多种技术实现方式,这些细枝末节层层交错,从而形成了壮观的Visual C++(www.cppentry.com)技术脉络图。本节将实现一个目标,即将孔乙己的"茴"字输出至某个文件中,并再次读取出来。其中主要的技术点就是针对文件做一些操作,而Visual C++(www.cppentry.com)关于文件的操作方式就非常之多,有Windows API方式、C++(www.cppentry.com)标准库方式等,这些方式如图2-48所示。
以下详细介绍使用在Windows系统中以各种方式(优雅的或者鄙俗的)写出"茴"字。
|
| (点击查看大图)图2-48 茴字的N种写法 |
2.5.1 使用Windows API
API的英文全称为Application Programming Interface,Win32 API也就是Microsoft Windows 32位平台的应用程序编程(www.cppentry.com)接口。想一想,如果没有Win32 API,我们该如何操作文件?自己去驱动磁盘驱动器?自己去编写硬件驱动程序?不可能。Windows API介于Windows操作系统与应用程序之间,因此它是离Windows操作系统最近的函数接口,它们之间的关系如图2-49所示。
|
| 图2-49 Windows API的位置 |
针对文件读写这一最基础的操作,很显然,Windows会责无旁贷地提供操作函数:- HANDLE CreateFile(
- LPCTSTR lpFileName,
- DWORD dwDesiredAccess,
- DWORD dwShareMode,
- LPSECURITY_ATTRIBUTES lpSecurityAttributes,
- DWORD dwCreationDisposition,
- DWORD dwFlagsAndAttributes,
- HANDLE hTemplateFile
- );
-
- BOOL WriteFile(
- HANDLE hFile,
- LPCVOID lpBuffer,
- DWORD nNumberOfBytesToWrite,
- LPDWORD lpNumberOfBytesWritten,
- LPOVERLAPPED lpOverlapped
- );
-
- BOOL ReadFile(
- HANDLE hFile,
- LPVOID lpBuffer,
- DWORD nNumberOfBytesToRead,
- LPDWORD lpNumberOfBytesRead,
- LPOVERLAPPED lpOverlapped
- );
读者根据如上函数原型,不难理解如何使用Win32 API。在Visual C++(www.cppentry.com)中调用Windows API,大部分情况下需要包含一个windows.h。
现在动手
接下来我们体验一下如何调用文件操作API,来完成文件的读写。
【程序 2 11】使用Windows API输出茴字
- 01 #include "stdafx.h"
- 02 #include <windows.h>
- 03 #include <cstdio>
- 04
- 05 int main()
- 06 {
- 07 HANDLE hFile;
- 08 DWORD nBytes;
- 09
- 10
- 11 hFile = CreateFile( _T("test.out"),
- 12 GENERIC_WRITE,
- 13 FILE_SHARE_WRITE,
- 14 NULL,
- 15 CREATE_ALWAYS,
- 16 0,
- 17 NULL );
- 18 char msg[] = "茴香豆的茴";
- 19 if( hFile != INVALID_HANDLE_VALUE )
- 20 {
- 21 WriteFile( hFile, msg, sizeof(msg) - 1, &nBytes, NULL );
- 22 CloseHandle(hFile);
- 23 }
- 24
- 25
- 26 hFile = CreateFile( _T("test.out"),
- 27 GENERIC_READ,
- 28 FILE_SHARE_READ,
- 29 NULL,
- 30 OPEN_ALWAYS,
- 31 0,
- 32 NULL );
- 33 if( hFile != INVALID_HANDLE_VALUE )
- 34 {
- 35 char line[256] = {0};
- 36 BOOL bResult;
- 37 bResult = ReadFile(hFile,
- 38 line,
- 39 sizeof(line),
- 40 &nBytes,
- 41 NULL) ;
- 42
- 43 if (nBytes != 0 )
- 44 {
- 45 printf("%s\r\n", line);
- 46 }
- 47
- 48 CloseHandle(hFile);
- 49 }50 }
运行该程序,读者将会发现项目目录下会生成一个test.out文件,同时控制台输出结果如图2-50所示。
|
| 图2-50 运行结果 |
可以看出,使用Windows API进行编程(www.cppentry.com),代码的可读性并不是很高。因此一般情况下,我们推荐使用标准库或者MFC类来进行操作。
光盘导读
该项目对应于光盘中的目录"\ch02\ WinApiWriter"。
【责任编辑:
云霞 TEL:(010)68476606】