VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 177|回复: 2

[原创] 《C/C++ Windows 程序设计》 输出贴

[复制链接]
74_avatar_middle
最佳答案
0 
在线会员 发表于 2021-11-20 14:00:26 | 显示全部楼层 |阅读模式
学习《C/C++ Windows 程序设计》的第五天


                编译环境:Window10 VS2019

                学习目的:遍历本机硬盘盘符及属性并打印出来

                涉及知识点:API函数[GetLogicalDriveStrings()|GetDriveType()|GetDiskFreeSpaceEx]、读取指针数据

                1、GetLogicalDriveStrings():获取一个字串,其中包含了当前所有逻辑驱动器的根驱动器路径

                        注意点:        1、第二个参数指向指针的首地址,每个盘符以\0结尾,最终衣蛾\0\0结尾;

                                        2、成功返回实际所需要占的空间,不包含最终\0\0的大小,失败则返回0;

                2、GetDriveType():确定磁盘驱动器的类型

                3、 GetDiskFreeSpaceEx():获取一个磁盘分区的组织以及剩余空间容量有关的信息

                实例代码:[遍历本机所有盘符,并输出所有盘符的相关信息]

                #include <Windows.h>
                #include <iostream>
                #include <tchar.h>
                using namespace std;

                #pragma warning (disable:4996)

                int main(int argc, char* argv[])
                {
                        //获取需要存储盘符的实际空间,不包含\0\0
                        DWORD dwRet=GetLogicalDriveStrings(0, NULL);
                        //判断是否执行成功
                        if (dwRet != 0)
                        {
                                //定义存放缓冲区的大小,并分配一块内存空间
                                TCHAR* p_缓冲区数据 = new TCHAR(dwRet + 10);
                                //清空该部分内存空间,该函数的第二参数单位为字节
                                ZeroMemory(p_缓冲区数据, (dwRet + 10) * sizeof(TCHAR));
                                //获取实际数据
                                dwRet = GetLogicalDriveStrings(dwRet + 10, p_缓冲区数据);
                                //判断是否执行成功
                                if (dwRet != 0)
                                {
                                        TCHAR* p_单个盘符 = p_缓冲区数据;
                                        //do循环遍历
                                        do
                                        {
                                                //p_缓冲区数据如果遇到盘符中\0,则条件不成立
                                                if (*p_单个盘符)
                                                {
                                                        wcout << p_单个盘符;
                                                        UINT n_盘符类型 = GetDriveType(p_单个盘符);
                                                        switch (n_盘符类型)
                                                        {
                                                        case DRIVE_UNKNOWN:
                                                                wcout << "未知的磁盘类型" << endl;
                                                                break;
                                                        case DRIVE_NO_ROOT_DIR:
                                                                wcout << "盘符无效" << endl;
                                                                break;
                                                        case DRIVE_REMOVABLE:
                                                                wcout << "可移动磁盘" << endl;
                                                                break;
                                                        case DRIVE_FIXED:
                                                                wcout << "固定磁盘" << endl;
                                                                break;
                                                        case DRIVE_REMOTE:
                                                                wcout << "网络磁盘" << endl;
                                                                break;
                                                        case DRIVE_CDROM:
                                                                wcout << "光驱" << endl;
                                                                break;
                                                        case DRIVE_RAMDISK:
                                                                wcout << "RAM" << endl;
                                                                break;
                                                        default:
                                                                break;
                                                        }
                                                        wcout << endl;
                                                }

                                                p_单个盘符 += _tcslen(p_单个盘符) + 1;
                                        } while (*p_单个盘符);
                                }
                                dwRet = dwRet;
                        }
                        return 0;
                }

                  调试问题:1、出现“获取本地盘符信息.exe 已触发了一个断点。”这个问题有哪位遇到过,帮忙解答一下,还未找到解决办法,有知道的能否帮忙解答一下。

                                                                                                                                        2021年11月20日




上一篇:《C/C++ Windows 程序设计》 输出贴
下一篇:《C/C++ Windows 程序设计》 输出贴
75_avatar_middle
最佳答案
22 
online_supermod 发表于 2021-11-21 10:54:09 | 显示全部楼层
你这端代码我不确定哪里除了问题但是出发断点,以往经验可能是内存,记住是可能,我花了10分钟尝试但是并没有解决该问题于是,找了一段功能差不多得代码你参考一下,我这边是2017VS是可以正常输出得
《C/C++ Windows 程序设计》 输出贴
代码如下
#include <iostream>
#include <windows.h>
using namespace std;

int main()
{
    int DiskCount = 0;
    DWORD DiskInfo = GetLogicalDrives();
//利用GetLogicalDrives()函数可以获取系统中逻辑驱动器的数量,函数返回的是一个32位无符号整型数据。
        while (DiskInfo)//通过循环操作查看每一位数据是否为1,如果为1则磁盘为真,如果为0则磁盘不存在。
        {
                {
                        if (DiskInfo & 1)//通过位运算的逻辑与操作,判断是否为1
                        {
                                ++DiskCount;
                        }
                        DiskInfo = DiskInfo >> 1;//通过位运算的右移操作保证每循环一次所检查的位置向右移动一位。
                        //DiskInfo = DiskInfo/2;
                }
                cout << "逻辑磁盘数量:" << DiskCount << endl;

                int DSLength = GetLogicalDriveStrings(0, NULL);
                //通过GetLogicalDriveStrings()函数获取所有驱动器字符串信息长度。
                char* DStr = new char[DSLength];//用获取的长度在堆区创建一个c风格的字符串数组
                GetLogicalDriveStrings(DSLength, (LPTSTR)DStr);
                //通过GetLogicalDriveStrings将字符串信息复制到堆区数组中,其中保存了所有驱动器的信息。

                int DType;
                int si = 0;
                BOOL fResult;
                unsigned _int64 i64FreeBytesToCaller;
                unsigned _int64 i64TotalBytes;
                unsigned _int64 i64FreeBytes;

       
                for (int i = 0; i < DSLength / 4; ++i)
                        //为了显示每个驱动器的状态,则通过循环输出实现,由于DStr内部保存的数据是A:\NULLB:\NULLC:\NULL,这样的信息,所以DSLength/4可以获得具体大循环范围
                {
                        char dir[3] = { DStr[si],':','\\' };
                        DType = GetDriveType(DStr + i * 4);
                        //GetDriveType函数,可以获取驱动器类型,参数为驱动器的根目录
                        if (DType == DRIVE_FIXED)
                        {
                                cout << "固定硬盘";
                        }
                        else if (DType == DRIVE_CDROM)
                        {
                                cout << "光驱";
                        }
                        else if (DType == DRIVE_REMOVABLE)
                        {
                                cout << "可移动式磁盘";
                        }
                        else if (DType == DRIVE_REMOTE)
                        {
                                cout << "网络磁盘";
                        }
                        else if (DType == DRIVE_RAMDISK)
                        {
                                cout << "虚拟RAM磁盘";
                        }
                        else if (DType == DRIVE_UNKNOWN)
                        {
                                cout << "未知设备";
                        }

                        cout << endl;
                        si += 4;
                }
          }
   

    system("pause");
}
74_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2021-11-21 13:07:48 | 显示全部楼层
wl1383838438 发表于 2021-11-21 10:54
你这端代码我不确定哪里除了问题但是出发断点,以往经验可能是内存,记住是可能,我花了10分钟尝试但是并没 ...

非常感谢,你的这段代码中又有几个我想弄清楚的问题,但还未到那个程度,现在看到了,随着课程的学习帮助会很大,这个问题可能还是编译器的问题。我在网络上搜索的多数都是指向内存问题,试过网络提供的办法,都没解决。先暂放,随着课程学习,后面返回再来看这个问题。再次感谢。
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

×【发帖 友情提示】
1、请回复有意义的内容,请勿恶意灌水;
2、纯数字、字母、表情等无意义的内容系统将自动删除;
3、若正常回复后帖子被自动删除,为系统误删的情况,请重新回复其他正常内容或等待管理员审核通过后会自动发布;
4、感谢您对VC驿站一如既往的支持,谢谢合作!

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号-4 )|网站地图wx_jqr

GMT+8, 2021-11-30 02:15

Powered by CcTry.CoM

© 2009-2021 cctry.com

快速回复 返回顶部 返回列表