4.7 创建打开读写文件
说明
我只能说Unicode很坑,所以我改成了ANSI编码.
效果
源码
#include
#include
//获取文件内容以16进制打印
DWORD ReadFileContent(LPSTR szFilePath){
HANDLE hFileRead;//文件句柄
LARGE_INTEGER liFileSize;//文件大小
DWORD dwReadSize;//读取的文件大小
LONGLONG liTotalRead = 0;//累加已读取的大小
BYTE lpFileDataBuffer[32];//文件数据缓存
//打开已存在的文件并读取内容
hFileRead = CreateFile(
szFilePath,//要打开的文件名
GENERIC_READ,//已读方式打开
FILE_SHARE_READ,//可共享读
NULL,//默认安全设置
OPEN_EXISTING,//只打开已经存在的文件
FILE_ATTRIBUTE_NORMAL,//常规文件属性
NULL//无模板
);
if (hFileRead == INVALID_HANDLE_VALUE){
printf("打开文件失败: %d\n", GetLastError());
}
if (!GetFileSizeEx(hFileRead, &liFileSize)){
printf("获取文件大小失败: %d\n", GetLastError());
} else{
printf("文件大小为: %d\n", liFileSize.QuadPart);
}
//循环读取并打印文件内容
while (TRUE){
DWORD i;
if (!ReadFile(
hFileRead,//文件的句柄
lpFileDataBuffer,//存储读取的文件内容
32,//一次读取的大小 32字节
&dwReadSize,//实际读取的大小
NULL//不使用overlapped
)){
printf("读取文件错误: %d\n", GetLastError());
break;
}
printf("读取了 %d 字节,文件内容是:\n", dwReadSize);
for (i = 0; i< dwReadSize; i++){
printf("0x%x ", lpFileDataBuffer[i]);
}
printf("\n");
liTotalRead += dwReadSize;//累加读取的数据大小
if (liTotalRead == liFileSize.QuadPart){
//如果累加的大小等于文件总大小
printf("读取文件结束\n");
break;
}
}
CloseHandle(hFileRead);
return 0;
}
//添加数据到文件尾
DWORD SaveDataToFile(LPSTR szFilePath, LPVOID lpData, DWORD dwDataSize){
HANDLE hFileWrite;//文件句柄
DWORD dwWriteDateSize;//成功写入的数据大小
//打开已存在的文件
hFileWrite = CreateFile(
szFilePath,//要打开的文件名
GENERIC_WRITE,//以写方式打开
0,//可共享读
NULL,//默认安全设置
OPEN_ALWAYS,//打开以存在的文件,没有则创建
FILE_ATTRIBUTE_NORMAL,//常规文件属性
NULL//无模板
);
if (hFileWrite == INVALID_HANDLE_VALUE){
printf("打开文件失败: %d\n", GetLastError());
}
//设置文件指针到文件尾
SetFilePointer(hFileWrite, 0, 0, FILE_END);
if (!WriteFile(hFileWrite, lpData, dwDataSize, &dwWriteDateSize, NULL)){
printf("写文件失败: %d\n", GetLastError());
} else{
printf("写文件成功,写入 %d 字节数据\n", dwWriteDateSize);
}
CloseHandle(hFileWrite);
return 0;
}
int main(int argc, PCHAR argv[]){
LPTSTR szFileData = TEXT("御坂网络写文件测试");
SaveDataToFile(TEXT("写文件.txt"), szFileData, lstrlen(szFileData));
ReadFileContent(TEXT("写文件.txt"));
getchar();
return 0;
}