** ``斜体样式最近在项目中,老师买了个采集卡,采集卡使用c++编写的,这个工程有点大,很多知识和C也不一样,就记录下自己每天在看代码中学习的东西。
数据要进行保存和读取项目中用的是windows的函数,
MFC
MFC(MicrosoftFoundationClasses)是微软基础类库的简称,是微软公司实现的一个c++类库,主要封装了大部分的windows API函数。 MFC除了是一个类库以外,还是一个框架,在vc++里新建一个MFC的工程,开发环境会自动帮你产生许多文件,同时它使用了mfcxx.dll。xx是版本,它封装了mfc内核,所以你在你的代码看不到原本的SDK编程中的消息循环等等东西,因为MFC框架帮你封装好了,这样你就可以专心的考虑你程序的逻辑,而不是这些每次编程都要重复的东西,但是由于是通用框架,没有最好的针对性,当然也就丧失了一些灵活性和效率。但是MFC的封装很浅,所以效率上损失不大。***
dword
DWORD全称Double Word,是指注册表的键值,每个word为2个字节的长度,DWORD 双字即为4个字节,每个字节是8位,共32位。
在键值项窗口空白处单击右键,选择"新建"菜单项,可以看到这些键值被细分为:字符串值、二进制值、DWORD值、多字符串值、可扩充字符串值五种类型。
cedit
CEdit类提供了Windows编辑控件中的功能。编辑控件是一个子窗口矩形,用户可以向其中输入文本。
1. CreateFile
HANDLE WINAPI CreateFile(
_In_ LPCTSTR lpFileName,
_In_ DWORD dwDesiredAccess,
_In_ DWORD dwShareMode,
_In_opt_ LPSECURITY_ATTRIBUTES lpSecurityAttributes,
_In_ DWORD dwCreationDisposition,
_In_ DWORD dwFlagsAndAttributes,
_In_opt_ HANDLE hTemplateFile
);
2. ReadFile
WINBASEAPI
BOOL
WINAPI
ReadFile(
_In_ HANDLE hFile,
_Out_writes_bytes_to_opt_(nNumberOfBytesToRead, *lpNumberOfBytesRead) __out_data_source(FILE) LPVOID lpBuffer,
_In_ DWORD nNumberOfBytesToRead,
_Out_opt_ LPDWORD lpNumberOfBytesRead,
_Inout_opt_ LPOVERLAPPED lpOverlapped
);
从文件指针指向的位置开始将数据读出到一个文件中, 且支持同步和异步操作,
参数说明
HANDLE hFile
, 需要读入数据的文件指针,这个指针指向的文件必须是GENERIC_READ
访问属性的文件。
LPVOID lpBuffer
,接收数据的缓冲区。
DWORD nNumberOfBytesToRead
,指定要读取的字节数。
LPDWORD lpNumberOfBytesRead
,指向一个DWORD类型变量的指针,用来接收读取的字节数。如果下一个参数为NULL,那么一定要传入这个参数。
LPOVERLAPPED lpOverlapped OVERLAPPED
结构体指针,如果文件是以FILE_FLAG_OVERLAPPED
方式打开的话,那么这个指针就不能为NULL。
FILE_FLAG_OVERLAPPED
允许对文件进行重叠操作
返回值
调用成功返回非0,否则返回0
示例代码
BOOL Read(char *filePath)
{
HANDLE pFile;
DWORD fileSize;
char *buffer,*tmpBuf;
DWORD dwBytesRead,dwBytesToRead,tmpLen;
pFile = CreateFile(filePath,GENERIC_READ,
FILE_SHARE_READ,
NULL,
OPEN_EXISTING, //打开已存在的文件
FILE_ATTRIBUTE_NORMAL,
NULL);
if ( pFile == INVALID_HANDLE_VALUE)
{
printf("open file error!\n");
CloseHandle(pFile);
return FALSE;
}
fileSize = GetFileSize(pFile,NULL); //得到文件的大小
buffer = (char *) malloc(fileSize);
ZeroMemory(buffer,fileSize);
dwBytesToRead = fileSize;
dwBytesRead = 0;
tmpBuf = buffer;
do{ //循环读文件,确保读出完整的文件
ReadFile(pFile,tmpBuf,dwBytesToRead,&dwBytesRead,NULL);
if (dwBytesRead == 0)
break;
dwBytesToRead -= dwBytesRead;
tmpBuf += dwBytesRead;
} while (dwBytesToRead > 0);
// TODO 处理读到的数据 buffer
free(buffer);
CloseHandle(pFile);
return TRUE;
}
3. WriteFile
WINBASEAPI
BOOL WINAPI WriteFile(
__in HANDLE hFile, // 文件句柄
__in LPCVOID lpBuffer, // 要写入的数据
__in DWORD nNumberOfBytesToWrite, // 要写入的字节数
__out LPDWORD lpNumberOfBytesWritten, // 实际写入的字节数
__in LPOVERLAPPED lpOverlapped // OVERLAPPED 结构,一般设定为 NULL
);
hFile
是文件句柄。
lpBuffer
是读写数据缓冲区。
nNumberOfBytesToWrite
是多少数据要写入。
lpNumberOfBytesWritten
是已经写入多少数据。
nNumberOfBytesToRead
是多少数据要读取。
nNumberOfBytesToRead
是已经读取多少数据。
lpOverlapped
是异步读写的结构。
示例
BOOL Write(char *buffer, DWORD contentLen)
{
HANDLE pFile;
char *tmpBuf;
DWORD dwBytesWrite,dwBytesToWrite;
pFile = CreateFile(filePath,GENERIC_WRITE,
0,
NULL,
CREATE_ALWAYS, //总是创建文件
FILE_ATTRIBUTE_NORMAL,
NULL);
if ( pFile == INVALID_HANDLE_VALUE)
{
printf("create file error!\n");
CloseHandle(pFile);
return FALSE;
}
dwBytesToWrite = contentLen;
dwBytesWrite = 0;
tmpBuf = buffer;
do{ //循环写文件,确保完整的文件被写入
WriteFile(pFile,tmpBuf,dwBytesToWrite,&dwBytesWrite,NULL);
dwBytesToWrite -= dwBytesWrite;
tmpBuf += dwBytesWrite;
} while (dwBytesToWrite > 0);
CloseHandle(pFile);
return TRUE;
}
void CreateFileDemo(void)
{
//
HANDLE hFile = ::CreateFile(_T("CreateFileDemo.txt"), //创建文件的名称。
GENERIC_WRITE|GENERIC_READ, // 写和读文件。
0, // 不共享读写。
NULL, // 缺省安全属性。
CREATE_ALWAYS, // 如果文件存在,也创建。
FILE_ATTRIBUTE_NORMAL, // 一般的文件。
NULL); // 模板文件为空。
if (hFile == INVALID_HANDLE_VALUE)
{
//
OutputDebugString(_T("CreateFile fail!/r/n"));
}
//往文件里写数据。
const int BUFSIZE = 4096;
char chBuffer[BUFSIZE];
memcpy(chBuffer,"Test",4);
DWORD dwWritenSize = 0;
BOOL bRet = ::WriteFile(hFile,chBuffer,4,&dwWritenSize,NULL);
if (bRet)
{
//
OutputDebugString(_T("WriteFile 写文件成功/r/n"));
}
//先把写文件缓冲区的数据强制写入磁盘。
FlushFileBuffers(hFile);
//
//从文件里读取数据。
LONG lDistance = 0;
DWORD dwPtr = SetFilePointer(hFile, lDistance, NULL, FILE_BEGIN);
if (dwPtr == INVALID_SET_FILE_POINTER)
{
//获取出错码。
DWORD dwError = GetLastError() ;
//处理出错。
}
DWORD dwReadSize = 0;
bRet = ::ReadFile(hFile,chBuffer,4,&dwReadSize,NULL);
if (bRet)
{
//
OutputDebugString(_T("ReadFile 读文件成功/r/n"));
}
else
{
//获取出错码。
DWORD dwError = GetLastError();
//处理出错。
TCHAR chErrorBuf[1024];
wsprintf(chErrorBuf,_T("GetLastError()=%d/r/n"),dwError);
OutputDebugString(chErrorBuf);
}