学习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.....

结束这天...

猜你喜欢

转载自www.cnblogs.com/JJBox/p/12535983.html