C++学习记录(1)

** ``斜体样式最近在项目中,老师买了个采集卡,采集卡使用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);
         }

可以查看
https://blog.csdn.net/caimouse/article/details/1835386

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值