微软提供了强大的文件读写操作的编程接口,所以可以通过调用API函数实现文件的读写操作。这里通过CreateFile函数来实现。
要对文件进行读写操作,首先要调用CreateFile函数打开或者创建文件,函数具体格式如下:
HANDLE CreateFile( LPCTSTR,lpFileName, //指向文件名的指针 DWORD dwDesiredAccess, //访问模式(读/写) DWORD dwShareMode, //共享模式 LPSECURITY_ATTRIBUTES lpSecurityAttributes,//指向安全属性的指针 DWORD dwCreationDisposition, //如何让创建 DWORD dwFlagAndAttributes, //文件属性 HANDLE hTemplateFile //用于复制文件句柄 );
lpFileName:要打开的文件名;
dwDesiredAccess:如果是GENERIC_READ表示允许对设备进行读访问;如果是GENERIC_WRITE表示允许对设备进行写访问(可以组合使用);如果是0,表示只允许获取与一个设备有关的信息;
dwShareMode:定义共享模式。如果是0表示不共享;是FILE_SHARE_READ和/或FILE_SHARE_WRITE表示允许对文件进行共享;
lpSecurityAttributes:指向一个SECURITY_ATTRIBUTES结构的指针,定义了文件的安全特性;
dwCreationDisposition:指定当文件存在或不存在时的操作。常见的操作有5种:
dwFlagAndAttributes:表示新创建文件的属性。文件的常见属性有5种:
hTemplateFile:指向用于存储的文件句柄;如果不为0,则指定一个文件句柄,新的文件将从这个文件中复制扩展属性;
如果该函数调用成功,返回文件句柄;否则返回INVALID_HANDLE_VALUE。该函数的具体调用方式如下:
(1)以只读的方式打开已存在的文件
HANDLE hFile=CreateFile("1.txt",GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
(2)以只写的方式打开已存在的文件
HANDLE hFILE=CreateFile("1.txt",GENERIC_WRITE,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
(3)创建一个新文件
HANDLE hFILE=CreateFile("1.txt",GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);在成功调用CreateFile函数之后,返回所打开的或创建的文件句柄,可调用ReadFile或WriteFile函数来读写文件。函数具体格式如下:
BOOL WriteFile( HANDLE fFile, //文件句柄 LPCVOID lpBuffer, //数据缓存区指针 DWORD nNumberOfBytesToWrite, //所要写的字节数 LPDWORD lpNumberOfBytesWritten,//用于保存实际写入字节数的存储区的指针 LPOVERLAPPED lpOverlapped //OVERLAPPED结构体指针 )
BOOL ReadFile( HANDLE fFile, //文件句柄 LPCVOID lpBuffer, //数据缓存区指针 DWORD nNumberOfBytesToRead, //所要写的字节数 LPDWORD lpNumberOfBytesRead, //用于保存实际写入字节数的存储区的指针 LPOVERLAPPED lpOverlapped //OVERLAPPED结构体指针 )
hFile:指向要读写的文件的句柄,一般由CreateFile函数返回;
lpBuffer:指向一个缓冲区,用于存储读写的数据;
nNumberOfBytesToWrite/Read:表示要求写入或读取的字节数;
nNumberOfBytesWritten/Read:表示返回实际写入或读取的字节数;
lpOverlapped:是指向OVERLAPPED结构体的指针,设置为NULL即可;
如果读取或写入成功,函数返回TRUE。完成文件读写操作后还需要调用CloseHandle函数关闭文件句柄,以便其它程序对文件进行操作。
下面的代码实现了在文件末尾写入数据的过程:
#include <stdio.h> #include <windows.h> int main() { HANDLE hFILE=CreateFile("1.txt",GENERIC_WRITE,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL); if(hFILE==INVALID_HANDLE_VALUE) { printf("CreateFile error\n"); return 0; } if(SetFilePointer(hFILE,0,NULL,FILE_END)==-1) { printf("SetFilePointer error\n"); return 0; } char buff[256]="hello"; DWORD dwWrite; if(!WriteFile(hFILE,&buff,strlen(buff),&dwWrite,NULL)) { printf("WriteFile error\n"); return 0; } printf("write %d.\n",dwWrite); printf("done.\n"); CloseHandle(hFILE); return 0; }
文件中内容如下:
下面的代码介绍了读取文件的过程:
#include <stdio.h> #include <windows.h> int main() { HANDLE hFile=CreateFile("1.txt",GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL); if(hFile==INVALID_HANDLE_VALUE) { printf("CreateFile error.\n"); return 0; } int file_size=0; file_size=GetFileSize(hFile,NULL); char *buff; buff=(char*)malloc(file_size); DWORD dwRead; if(!ReadFile(hFile,buff,file_size,&dwRead,NULL)) { printf("ReadFile error.\n"); return 0; } buff[file_size]='\0'; printf("content:%s\n",buff); CloseHandle(hFile); return 0; }
文件读取成功。