C/C++ Windows API——文件读写
【摘要】
// FileReadWriteDemo.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <Windows.h>
#include ...
// FileReadWriteDemo.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <Windows.h>
#include <locale.h>
int main()
{
//没有设置这句的话,printf中出现汉字包含后面的非汉字全部都打不出来
setlocale(LC_ALL, "chs");
BOOL ret;
LPCWSTR filePath = _T("C:\\Users\\Administrator\\Desktop\\file_demo_test.txt");
DWORD dwDesiredAccess = GENERIC_READ | GENERIC_WRITE;
DWORD dwShareMode = 0;
LPSECURITY_ATTRIBUTES lpSecurityAttributes = NULL;
DWORD dwCreationDisposition = OPEN_ALWAYS;
DWORD dwFlagsAndAttributes = FILE_ATTRIBUTE_NORMAL;
HANDLE hTemplateFile = NULL;
HANDLE handle = CreateFile(filePath, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile);
if (handle == NULL) {
printf("CreateFile fail(%ld)", GetLastError());
}
else {
DWORD len;
TCHAR *writeBuf = L"Win32 API 你好";
TCHAR readBuf[1024];
/*
ASCII:不加前缀(如果写入unicode字符串读出来会是乱码)
Unicode:0xFEFF
UTF8:0xEFBBBF
注意写入后用十六进制编辑器查看高低位是互换的(因为C是小端编码)
*/
WORD prefix = 0xFEFF;
/*
BOOL WriteFile(
HANDLE hFile,//文件句柄
LPCVOID lpBuffer,//数据缓存区指针
DWORD nNumberOfBytesToWrite,//你要写的字节数
LPDWORD lpNumberOfBytesWritten,//用于保存实际写入字节数的存储区域的指针
LPOVERLAPPED lpOverlapped//OVERLAPPED结构体指针
);
return 失败返回0,成功返回非0
*/
ret = WriteFile(handle, &prefix, 2, &len, NULL);
if (ret == 0) {
printf("WriteFile prefix fail(%ld)\n", GetLastError());
}
else {
printf("WriteFile prefix -> writeLen=%d\n", len);
}
/*
把写缓冲区中的数据实际写入到文件中
WINBASEAPI BOOL WINAPI FlushFileBuffers(_In_ HANDLE hFile);
return 失败返回0, 成功返回非0
*/
ret = FlushFileBuffers(handle);
if (ret == 0) {
printf("FlushFileBuffers fail(%d)\n", GetLastError());
}
else {
printf("FlushFileBuffers -> ret=%d\n", ret);
}
ret = WriteFile(handle, writeBuf, lstrlen(writeBuf)*sizeof(TCHAR), &len, NULL);
if (ret == 0) {
printf("WriteFile buf fail(%ld)\n", GetLastError());
}
else {
printf("WriteFile buf=%ls -> writeLen=%ld\r\n", writeBuf, len);
}
/*
一个文件中设置当前的读取位置
DWORD SetFilePointer(
HANDLE hFile, // 文件句柄
LONG lDistanceToMove, // 偏移量(低位)
PLONG lpDistanceToMoveHigh, // 偏移量(高位)
DWORD dwMoveMethod // 基准位置FILE_BEGIN:文件开始位置 FILE_CURRENT:文件当前位置 FILE_END:文件结束位置
);
return Long,返回一个新位置,它采用从文件起始处开始算起的一个字节偏移量。HFILE_ERROR意味着出错。会设置GetLastError
*/
DWORD pos = SetFilePointer(handle, 2, 0, FILE_BEGIN);
if (pos == HFILE_ERROR) {
printf("SetFilePointer fail(%ld)\n", GetLastError());
}
else {
printf("SetFilePointer -> pos=%ld\n", pos);
}
/*
BOOL ReadFile(
HANDLE hFile, //文件的句柄
LPVOID lpBuffer, //用于保存读入数据的一个缓冲区
DWORD nNumberOfBytesToRead, //要读入的字节数
LPDWORD lpNumberOfBytesRead, //指向实际读取字节数的指针
LPOVERLAPPED lpOverlapped //如文件打开时指定了FILE_FLAG_OVERLAPPED,那么必须,用这个参数引用一个特殊的结构。该结构定义了一次异步读取操作。否则,应将这个参数设为NULL
);
return 失败返回0,成功返回非0
注意:ReadFile可以读取文件中所有的数据。如果指针设为FILE_BEGIN的话,有可能读的前几个字节是文件编码,而不是所需的数据,这点要小心
*/
ret = ReadFile(handle, readBuf, 1024, &len, NULL);
if (ret == 0) {
printf("ReadFile fail(%ld)\n", GetLastError());
}
else {
//凡是从文件流中读出来的字符串都不会自动补\0,需要手动填充
readBuf[len / sizeof(TCHAR)] = L'\0';
printf("ReadFile -> len=%ld, buf=%ls\n", len, readBuf);
}
CloseHandle(handle);
}
system("pause");
return 0;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
- 100
- 101
- 102
- 103
- 104
- 105
- 106
- 107
- 108
- 109
- 110
- 111
- 112
- 113
- 114
- 115
- 116
- 117
- 118
- 119
- 120
- 121
- 122
- 123
文章来源: blog.csdn.net,作者:福州-司马懿,版权归原作者所有,如需转载,请联系作者。
原文链接:blog.csdn.net/chy555chy/article/details/52858440
【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)