zoukankan      html  css  js  c++  java
  • 学习vc++的第七天--读写文件+遍历文件夹

    今天把前面几天的博客转到日记去了,然后不给转回来...............................

    搜了一下博客园问答,确实要让我重新发博客..............日了狗了.................

    今天看了一节视频而已,主要是身体很乏...https://www.bilibili.com/video/av79302998?p=65

    学会了二进制读写

    struct Student
    {
    public:
        int age;
        char sex;
        char name[32];
    };
    
    
    //路径操作
    int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPreInstance, LPTSTR lpCmdLine, int nShowCmd)
    {
        LPCWSTR pl = _T("D:\桌面\我爱学习VC程站的课程");
        //创建单一层级目录
        CreateDirectory(pl, NULL);
        //移除目录
        RemoveDirectory(pl); //只能删除空目录
        EnumFiles(_T("D:\桌面"), _T("*.*"));
    
        return 0;
    }
    
    //二进制数据的操作 
    int WINAPI _tWinMain文件读写(HINSTANCE hInstance, HINSTANCE hPreInstance, LPTSTR lpCmdLine, int nShowCmd)
    {
        LPCTSTR path = _T("D:\桌面\a.txt");
    
        HANDLE hFile = CreateFile(path,
            GENERIC_READ | GENERIC_WRITE,     //读写模式
            FILE_SHARE_READ,                  //其他人以读的权限打开
            NULL,                             //安全描述符 
            OPEN_ALWAYS,                      //打开失败也创建一个 
            FILE_ATTRIBUTE_NORMAL,            //文件属性
            NULL);                            //模板文件的句柄
    
        if (hFile == INVALID_HANDLE_VALUE)//打开文件的错误码
        {
            DWORD dwError = GetLastError(); //放在错误语句的后面..
            MessageBox(NULL, _T("创建或打开失败!"), _T("提示"), MB_OK | MB_ICONERROR | MB_DEFBUTTON1);
            return 0;
        }
    
        int num = 123;
        DWORD red = 0;  // PDWORD  red = 0;
    
        BOOL bRet;
        bRet = WriteFile(
            hFile,       //文件的句柄
            &num,        //起始的地址
            sizeof(num), //单位字节数
            &red,         //实际上写了多少数量,接收返回
            NULL         //异步写操作
            );
    
        CHAR ch = 'q';
        bRet = WriteFile(hFile, &ch, sizeof(ch), &red, NULL);
    
        CHAR strs[32] = "啊啊我";
        bRet = WriteFile(hFile, &strs, sizeof(strs), &red, NULL);
    
        Student su;
        su.age = 124;
        su.sex = 'f';
        strcpy_s(su.name, "zhangsan");
        bRet = WriteFile(hFile, &su, sizeof(su), &red, NULL);
    
        if (bRet)
        {
            // MessageBox(NULL, _T("写入成功!"), _T("提示"), MB_OK | MB_ICONERROR | MB_DEFBUTTON1);
        }
        else
        {
            MessageBox(NULL, _T("写入失败!"), _T("提示"), MB_OK | MB_ICONERROR | MB_DEFBUTTON1);
        }
    
        //结束写入
        CloseHandle(hFile);//有效句柄就关闭文件 
    
        //重新读取(防止文件指针在最后面)
        hFile = CreateFile(path,
            GENERIC_READ | GENERIC_WRITE,     //读写模式
            FILE_SHARE_READ,                  //其他人以读的权限打开
            NULL,                             //安全描述符 
            OPEN_ALWAYS,                      //打开失败也创建一个 
            FILE_ATTRIBUTE_NORMAL,            //文件属性
            NULL);                            //模板文件的句柄
    
        if (hFile == INVALID_HANDLE_VALUE)//打开文件的错误码
        {
            DWORD dwError = GetLastError(); //放在错误语句的后面..
            MessageBox(NULL, _T("创建或打开失败!"), _T("提示"), MB_OK | MB_ICONERROR | MB_DEFBUTTON1);
            return 0;
        }
    
    #if false //每个数据类型都读入
        //读二进制文件 
        int ret_num = 0;//读取返回内容
        DWORD dwRealRead = 0;
        bRet = ReadFile(
            hFile,           //文件的句柄
            &ret_num,        //起始的地址,返回读取内容
            sizeof(ret_num), //读取大小
            &dwRealRead,     //实际上读了多少数量,接收返回
            NULL             //异步写操作
            );
    
        char cha = 0;//读取返回内容
        bRet = ReadFile(hFile, &cha, sizeof(cha), &dwRealRead, NULL);
    
        char szTextRet[32] = { 0 }; //首地址所以不用&
        bRet = ReadFile(hFile, szTextRet, sizeof(szTextRet), &dwRealRead, NULL);
    
        Student stud2 = { 0 };
        bRet = ReadFile(hFile, &stud2, sizeof(Student), &dwRealRead, NULL);
        if (bRet)
        {
            // MessageBox(NULL, _T("数据读取成功!"), _T("Tip"), MB_OK);
        }
        else
        {
            MessageBox(NULL, _T("数据读取失败!"), _T("Tip"), MB_OK);
        }
    #else 
        //利用文件指针跳跃前面几个数据类型
        //SetFilePointer(hFile,
        //    sizeof(int)+ sizeof(char), //要越过的距离
        //    NULL,                      //不高过32位就不用
        //    FILE_BEGIN                 //从头往后移动
        //    );    
    
        LONG ui = -32 - (LONG)sizeof(Student);
        SetFilePointer(hFile,
            ui,       //要越过的距离
            NULL,     //不高过32位就不用
            FILE_END  //后面往前移动
            );
    
        //读二进制文件  
        DWORD dwRealRead = 0;
        CHAR szTextRet[32] = { 0 }; //首地址所以不用&
        bRet = ReadFile(hFile, szTextRet, sizeof(szTextRet), &dwRealRead, NULL);
    
        Student stud2 = { 0 };
        bRet = ReadFile(hFile, &stud2, sizeof(Student), &dwRealRead, NULL);
        if (bRet)
        {
            // MessageBox(NULL, _T("数据读取成功!"), _T("Tip"), MB_OK);
        }
        else
        {
            MessageBox(NULL, _T("数据读取失败!"), _T("Tip"), MB_OK);
        }
    #endif // false //每个数据类型都读入
    
        CloseHandle(hFile);//有效句柄就关闭文件 
        return 0;
    }
    View Code

    然后学习了遍历目录和文件,

    难点是要处理控制台输出中文的问题...

    /// <summary>
    /// 枚举所有文件
    /// </summary>
    /// <param name="lpazPath">路径</param>
    /// <param name="lpzType">类型</param>
    /// <returns>BOOL.</returns>
    BOOL EnumFiles(LPCTSTR lpazPath, LPCTSTR lpzType)
    {
        TCHAR szPath[MAX_PATH] = { 0 };//最大的路径长度
        _stprintf_s(szPath, _T("%s\%s"), lpazPath, lpzType);//合并字符串
    
        WIN32_FIND_DATA FindData = { 0 };//用于装载找到的类型,来给后续遍历
        HANDLE hFind = FindFirstFile(szPath, &FindData);
        if (hFind == INVALID_HANDLE_VALUE) return FALSE;
    
        // https://zhidao.baidu.com/question/105950396.html
        wcout.imbue(locale("chs"));//设置控制台输出中文
    
        //继续遍历
        BOOL bRet;
        do
        {
            bRet = FindNextFile(hFind, &FindData);
            if (!bRet)
            {
                break;
            }
            wcout << FindData.cFileName << endl; 
        } while (bRet);
     
        return TRUE;
    }
    
    
    
    int main()
    {
        EnumFiles(_T("C:\Windows"), _T("*.*"));
        EnumFiles(_T("D:\桌面\新建文件夹"), _T("*.*"));//处理中文
        cin.get();
    }
    View Code

    在窗体工程上面转到控制台的方法..然后记得用 main() 而不是 _tWinMain() 作为函数的起始函数....貌似还可以改入口点函数...

    然后为了实现和c#一样的函数注释,在vs2019上面安装了一下GhostDoc.....

    结束这天...

  • 相关阅读:
    基于matlab的退化图像复原(一)------图像退化处理
    风洞稳定小球系统(二)----- 基于Arduino实现的PID距离PWM控制
    风洞稳定小球系统(一)----- 基于MATLAB实现的Kalman filter滤波距离检测
    matlab基本粒子群算法实现(四)
    使用SC命令时注意事项
    abiword Namespace List
    Improving the AbiWord's Piece Table
    Font Rending 的 Hint 机制对排版的影响
    abiword Related Pages
    跟我一起写 Makefile
  • 原文地址:https://www.cnblogs.com/JJBox/p/12535983.html
Copyright © 2011-2022 走看看