VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 147|回复: 7

第12课求助

[复制链接]
86_avatar_middle
最佳答案
0 
在线会员 发表于 2020-4-5 12:50:20 | 显示全部楼层 |阅读模式
bool GetDiskSpace(LPCTSTR lpszDrive)
{
        if (!lpszDrive || _tcslen(lpszDrive) < 3) return false;
        DWORD dwSectPerClust = 0;     //每个簇有多少个扇区
        DWORD dwBytesPerSect = 0;     //每个扇区有多少个字节
        DWORD dwTotalClusters = 0;    //总的簇
        DWORD dwFreeClusters = 0;     //可用的簇
        BOOL bRet = GetDiskFreeSpace(lpszDrive, &dwSectPerClust, &dwBytesPerSect, &dwFreeClusters, &dwTotalClusters);
        if (!bRet) return FALSE;
        cout << "使用 GetDiskFreeSpace 函数获取磁盘空间信息" << endl;
        cout << "每个簇有多少个扇区: " << dwSectPerClust << endl;
        cout << "每个扇区有多少个字节: " << dwBytesPerSect << endl;
        cout << "可用的簇: " << dwFreeClusters << endl;
        cout << "总簇数量: " << dwTotalClusters << endl;
        cout << "磁盘总容量: " << dwTotalClusters * (DWORD64)dwSectPerClust * (DWORD64)dwBytesPerSect << endl;
        cout << "磁盘空闲容量: " << dwFreeClusters * (DWORD64)dwSectPerClust * (DWORD64)dwBytesPerSect << endl;
        return true;
} 这是抄的老师的代码 本来自己写了 老报错就试试老师的没想到还是一样   运行到GetDiskFreeSpace(lpszDrive, &dwSectPerClust, &dwBytesPerSect, &dwFreeClusters, &dwTotalClusters);    第12课求助


int main(int args, TCHAR* argv)
{

        DWORD dwsize=GetLogicalDriveStrings(0,NULL);//获取需要的字符串大小
        TCHAR* psizepath = new TCHAR[dwsize + 10];//比获取到的适当大点预留空间
        ZeroMemory(psizepath, (dwsize + 10)*sizeof(DWORD));//清零字符

        GetLogicalDriveStrings(dwsize + 10, psizepath);//获取盘符驱动
        DWORD SectorsPerCluster=0,BytesPerSector=0,NumberOfFreeClusters=0,TotalNumberOfClusters=0;//定义每簇的扇区数,每扇区的字节数,空余簇的数量,全部簇的数量
        //wcout << psizepath;
        if (*psizepath)
        {
                do {
                       
                        UINT uidrivetype= GetDriveType(
                                psizepath
                        );
                        switch (uidrivetype)//判断磁盘类型
                        {
                        case DRIVE_UNKNOWN:
                                cout << "未知的磁盘类型 ";
                                break;
                        case DRIVE_NO_ROOT_DIR:
                                cout << "是无效的 ";
                             break;
                        case DRIVE_REMOVABLE:
                                cout << "可移动磁盘 ";
                                break;
                        case DRIVE_FIXED:
                                cout << "固定磁盘 ";
                                break;
                        case DRIVE_REMOTE:
                                cout << "网络磁盘 ";
                                break;
                        case DRIVE_CDROM:
                                cout << "光驱 ";
                                break;
                        case DRIVE_RAMDISK:
                                cout << "RAM磁盘类型 ";
                                break;
                        default:
                                break;
                        }
               
                    wcout << psizepath << endl;
                       
                        //BOOL bret = GetDiskFreeSpace(ps, &SectorsPerCluster, &BytesPerSector, &NumberOfFreeClusters, &TotalNumberOfClusters);
                        GetDiskSpace(psizepath);
                        psizepath += wcslen(psizepath) + 1;
                       
                } while (*psizepath);
        }
delete []psizepath;//删除动态申请的空间 防止内存泄漏
        return 0;
}  这是主函数 求解




上一篇:在文档中读取数据
下一篇:这道题太难了。。
75_avatar_middle
最佳答案
18 
online_supermod 发表于 2020-4-5 17:21:29 | 显示全部楼层
你把源码 贴出来 我试试    有源码方便一点
86_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2020-4-5 18:00:59 | 显示全部楼层
wl1383838438 发表于 2020-4-5 17:21
你把源码 贴出来 我试试    有源码方便一点

这就是源码呀
51_avatar_middle
最佳答案
79 
online_admins 发表于 2020-4-5 19:40:04 | 显示全部楼层

有几处错误:
第一处:
TCHAR* psizepath = new TCHAR[dwsize + 10];//比获取到的适当大点预留空间
ZeroMemory(psizepath, (dwsize + 10)*sizeof(DWORD));//清零字符

new 申请的是 TCHAR[dwsize + 10],所以 ZeroMemory 清零的时候就应该是:
ZeroMemory(psizepath, (dwsize + 10)*sizeof(TCHAR));//清零字符

第二处,new 申请的时候的地址已经存在 psizepath 这个指针中了,所以 delete 释放的时候也要用这个地址 psizepath,但是中途楼主对这个指针的地址操作了:psizepath += wcslen(psizepath) + 1; 所以 delete 的时候的 psizepath 地址就不是 new 时候的 psizepath 地址了。所以 delete 释放的时候肯定会报错。

正确的做法是new 申请完了之后要把 psizepath 的地址保存下来,delete 释放的时候再拿过来。
51_avatar_middle
最佳答案
79 
online_admins 发表于 2020-4-5 19:40:18 | 显示全部楼层
完整的程序如下:
  1. int main()
  2. {
  3.         DWORD dwsize = GetLogicalDriveStrings(0, NULL);//获取需要的字符串大小
  4.         TCHAR* psizepath = new TCHAR[dwsize + 10];//比获取到的适当大点预留空间
  5.         ZeroMemory(psizepath, (dwsize + 10)*sizeof(TCHAR));//清零字符

  6.         TCHAR* pOrigPointer = psizepath;

  7.         GetLogicalDriveStrings(dwsize + 10, psizepath);//获取盘符驱动
  8.         DWORD SectorsPerCluster = 0, BytesPerSector = 0, NumberOfFreeClusters = 0, TotalNumberOfClusters = 0;//定义每簇的扇区数,每扇区的字节数,空余簇的数量,全部簇的数量
  9.         //wcout << psizepath;
  10.         if (*psizepath)
  11.         {
  12.                 do {

  13.                         UINT uidrivetype = GetDriveType(
  14.                                 psizepath
  15.                                 );
  16.                         switch (uidrivetype)//判断磁盘类型
  17.                         {
  18.                         case DRIVE_UNKNOWN:
  19.                                 cout << "未知的磁盘类型 ";
  20.                                 break;
  21.                         case DRIVE_NO_ROOT_DIR:
  22.                                 cout << "是无效的 ";
  23.                                 break;
  24.                         case DRIVE_REMOVABLE:
  25.                                 cout << "可移动磁盘 ";
  26.                                 break;
  27.                         case DRIVE_FIXED:
  28.                                 cout << "固定磁盘 ";
  29.                                 break;
  30.                         case DRIVE_REMOTE:
  31.                                 cout << "网络磁盘 ";
  32.                                 break;
  33.                         case DRIVE_CDROM:
  34.                                 cout << "光驱 ";
  35.                                 break;
  36.                         case DRIVE_RAMDISK:
  37.                                 cout << "RAM磁盘类型 ";
  38.                                 break;
  39.                         default:
  40.                                 break;
  41.                         }

  42.                         wcout << psizepath << endl;

  43.                         //BOOL bret = GetDiskFreeSpace(ps, &SectorsPerCluster, &BytesPerSector, &NumberOfFreeClusters, &TotalNumberOfClusters);
  44.                         GetDiskSpace(psizepath);
  45.                         psizepath += wcslen(psizepath) + 1;

  46.                 } while (*psizepath);
  47.         }
  48.         delete[]pOrigPointer;//删除动态申请的空间 防止内存泄漏
  49.         return 0;
  50. }
复制代码
15_avatar_middle
最佳答案
6 
online_vip 发表于 2020-4-5 19:47:17 | 显示全部楼层
delete有问题,delete的时候这时候psizepath变量早就不指向开始申请的堆内存首地址了,要考虑if语句成立时,while的时候psizepath为NULL就退出
把初始值保存下,在delete初始值
86_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2020-4-5 22:37:41 | 显示全部楼层
Syc 发表于 2020-4-5 19:40
完整的程序如下:

老大  获取盘符是对的  就是获取盘符容量一调用就出错
86_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2020-4-5 22:42:04 | 显示全部楼层
Syc 发表于 2020-4-5 19:40
完整的程序如下:

谢谢老大  换你的立马正常显示了  
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

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

关闭

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

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

GMT+8, 2020-8-5 17:51

Powered by CcTry.CoM

© 2009-2020 cctry.com

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