文件读写
微软提供了强大的文件读写(文件I/O)操作的编程接口,我们可以通过调用API函数的方式来实现文件的读写。一般情况下,文件的读写过程如图所示:
CreateFile函数
该函数的具体定义格式如下:
HANDLE CreateFile(
LPCTSTR lpFileName,//指向文件名的指针
DWORD dwDesiredAccess,//访问模式(读/写)
DWORD dwShareMode,//共享模式
LPSECURITY_ATTRIBUTES lpSecurityAttributes,//指向安全属性的指针
DWORD dwCreationDisposition,//如何创建
DWORD dwFlagsAndAttributes,//文件属性
HANDLE hTemplateFile//用于复制文件句柄
);
其中各个函数的具体要求如下:
- lpFileName:要打开的文件名称
- dwDesiredAccess:如为 GENERIC_READ 表示允许对设备进行读访问;如为 GENERIC_WRITE 表示允许对设备进行写操作(可组合使用);如为0,表示只允许获取与一个设备有关的信息。
- dwShareMode : 该参数的作用是定义共享模式。其值为0表示不共享;而为FILE_SHARE_READ和/或FILE_SHARE_WRITE表示允许对文件进行共享访问。
- lpSecurityAttributes :指向一个SECURITY_ATTRIBUTES结构的指针,定义了文件的安全特性(如果系统支持)。
- dwCreationDisposition : 指定当文件存在或不存在时的操作,常见的操作有如下5种:
- CREATE_NEW : 创建文件,如文件存在,则会出错。
- CREATE_ALWAYS:创建文件,会改下前一个文件。
- OPEN_EXCITING : 文件必须已经存在,由设备提出要求。
- OPEN_ALWAYS : 如文件不存在,则创建它。
- TRUNCATE_EXCITING : 将现有文件的长度缩短为零。
- dwFlagsAndAttributes :表示新创建文件的属性,文件常见的属性有以下五种:
- FILE_ATTRIBUTE_ARCHIVE:表示归档属性。
- FILE_ATTRIBUTE_NORMAL:默认属性。
- FILE_ATTRIBUTE_HIDDEN : 隐藏文件或目录。
- FILE_ATTRIBUTE_READONLY:文件为只读。
- FILE_ATTRIBUTE_SYSTEM:文件为系统文件。
- hTemplateFile:该参数指向用于存储的文件句柄,如果不为0,则指定一个文件句柄,新文件将从这个文件中复制扩展属性。
如果该函数调用成功,则返回文件句柄。否则返回INVALID_HANDLE_VALUE。
WriteFile/ReadFile函数
在成功调用CreateFile创建文件句柄之后,就返回所打开或创建的文件的句柄,可调用WriteFile函数或者ReadFile函数来读取文件。
这两个文件的具体格式如下:
BOOL WriterFile(
HANDLE hFile,//文件句柄
LPCVOID lpBuffer,//数据缓冲区指针
DWORD nNumberOfBytesToWrite,//要写入的字节数
LPDWORD lpNumberOfBytesWritten,//用于保存实际写入字节数的存储区域的指针
LPOVERLAPPED lpOverlapped//结构体指针
);
BOOL ReadFile(
HANDLE hFile,//文件句柄
LPCVOID lpBuffer,//数据缓冲区指针
DWORD nNumberOfBytesToRead,//要读取的字节数
LPDWORD lpNumberOfBytesRead,//指向保存实际读取字节数的存储区域的指针
LPOVERLAPPED lpOverlapped//结构体指针
);
其中各个函数的具体要求如下:
- hFile:该参数指向要读写的文件句柄,一般由CreateFile函数返回。
- lpBuffer : 指向一个缓冲区,用于存储读写的数据。
- nNumberOfBytesToWrite/Read : 这两个参数是表示要求写入或读取的字节数。
- lpNumberOfBytesWritten/Read : 这两个参数是表示返回实际写入或读取的字节数。
- lpOverlapped :是指向OVERLAPPED结构的指针,设置为NULL即可。
如果读取或写入操作成功,函数就会返回TRUE。在完成文件的读写操作后还需调用Handle函数关闭文件的句柄,以便其他程序对文件进行操作。
下面代码演示了如何在文件末尾写入数据,其具体过程如下:
#include <stdio.h>
#include <windows.h>
#include <iostream>
int main(int argc, char* argv[])
{
//调用CreateFile函数以只写方式打开一个文件
HANDLE hFile = CreateFile(argv[1], GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (hFile == INVALID_HANDLE_VALUE)
{
printf("CreateFile error\n");
return 0;
}
//调用SetFilePointer函数调整文件指针位置,移动到文件末尾
if (SetFilePointer(hFile, 0, NULL, FILE_END) == -1)
{
printf("SetFilePointer error\n");
return 0;
}
char buff[256] = "配置信息";
DWORD dwWrite;
//把buff中的内容写入到文件末尾
if(!WriteFile(hFile, &buff, strlen(buff), &dwWrite, NULL))
{
printf("WriteFile Error\n");
return 0;
}
printf("往 %s 中写入数据成功\n",argv[1]);
CloseHandle(hFile);
return 0;
}
其中SetFilePointer函数的作用是设置文件指针的位置。当一个文件被打开时,系统会维护一个文件指针,指向文件的下一个读写操作的位置,所以随着文件的读写,文件指针的位置也会随之移动。
我想要更好更远的月亮
想要未知的疯狂
想要声色的张扬