C++/MFC 获取文件大小kb两位小数,小数部分总是.00,求解

szx0427 2018-08-24 07:53:01
如题
废话不多说,上代码:
//VS2010 MFC,Unicode
void CBrowseFileDlg::OnBnClickedBrowse() //浏览文件按钮按下处理函数
{
// TODO: 在此添加控件通知处理程序代码
CString strPathName;
CString strFileName;
CString strText;
//浏览文件对话框
CFileDialog fileDlg(true,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,_T("所有文件(*.*)|*.*||"),NULL,NULL,false);
if(fileDlg.DoModal() == IDOK)
{
FILE *pFile;
strPathName = fileDlg.GetPathName(); //获得文件路径
strFileName = fileDlg.GetFileName(); //获得文件名称

//CString转char*
const size_t strSize = (strFileName.GetLength() + 1) * 2;
char *pCh = new char[strSize];
size_t sz = 0;
wcstombs_s(&sz,pCh,strSize,strFileName,_TRUNCATE);

pFile = fopen(pCh,"rb");
fseek(pFile,0,SEEK_END);
int nFileSize = ftell(pFile); //获得文件大小(字节)

double dKB = nFileSize / 1024; //获得文件大小(千字节)
double dMB = dKB / 1024; //获得文件大小(兆字节)

//下面,调试的时候打开文件显示的字节、MB都正常,KB的两位小数总是.00,怎么回事啊
strText.Format(_T("文件名:%s\r\n文件大小:%d 字节(%.2f KB, %.2f MB)"),strFileName,nFileSize,dKB,dMB);

m_file.SetWindowTextW(strPathName); //将文件路径显示到m_file编辑框
m_detail.SetWindowTextW(strText); //将文件详细信息显示到m_detail编辑框
}
}

本人新手,求大神,在线等。。。
只剩90个分了,上50个,求热心大神啊
...全文
232 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2018-08-26
  • 打赏
  • 举报
回复

#include <stdio.h>
char *human(__int64 v) {
__int64 g;
int i,j;
char N[8]=" KMGTPE";
static char s[20];

g=512i64;
for (i=0;i<6;i++) {
if (v<g) break;//
g=g<<10;
}
j=(i-1)*10;
if (j<0) j=0;
if (j==0) {
if (i==0) {
sprintf(s,"%I64d B",v);
} else {//i==1
sprintf(s,"%.4lg KB",(double)v/1024.0);
}
} else {//j>0
v=v>>j;
sprintf(s,"%.4lg %cB",(double)v/1024.0,N[i]);
}
return s;
}
int main() {
__int64 d,t;
while (1) {
printf("Input a number(0..%I64d):",0x7FFFFFFFFFFFFFFFi64);
fflush(stdout);
rewind(stdin);
if (1==scanf("%I64i",&d)) {
if (d>=0i64) break;//
}
}
printf("%I64d is %s\n",d,human(d));

printf("\n");
d=0i64;t=512i64;
while (1) {
printf("0x%016I64x is %s\n",d,human(d));
d+=t>>2;
if (d>=t) {
d=t-1i64;
printf("0x%016I64x is %s\n",d,human(d));
d=t;
printf("0x%016I64x is %s\n",d,human(d));
if (d>=0x2000000000000000i64) {
d=0x7FFFFFFFFFFFFFFFi64;
printf("0x%016I64x is %s\n",d,human(d));
break;//
}
if (d<0x0800000000000000i64) {
d=d<<8;
t=t<<10;
} else {
t=d<<1;
d+=t>>2;
}
}
}

return 0;
}
//Input a number(0..9223372036854775807):0x33333333333
//3518437208883 is 3.199 TB
//
//0x0000000000000000 is 0 B
//0x0000000000000080 is 128 B
//0x0000000000000100 is 256 B
//0x0000000000000180 is 384 B
//0x00000000000001ff is 511 B
//0x0000000000000200 is 0.5 KB
//0x0000000000020000 is 128 KB
//0x0000000000040000 is 256 KB
//0x0000000000060000 is 384 KB
//0x000000000007ffff is 512 KB
//0x0000000000080000 is 0.5 MB
//0x0000000008000000 is 128 MB
//0x0000000010000000 is 256 MB
//0x0000000018000000 is 384 MB
//0x000000001fffffff is 512 MB
//0x0000000020000000 is 0.5 GB
//0x0000002000000000 is 128 GB
//0x0000004000000000 is 256 GB
//0x0000006000000000 is 384 GB
//0x0000007fffffffff is 512 GB
//0x0000008000000000 is 0.5 TB
//0x0000800000000000 is 128 TB
//0x0001000000000000 is 256 TB
//0x0001800000000000 is 384 TB
//0x0001ffffffffffff is 512 TB
//0x0002000000000000 is 0.5 PB
//0x0200000000000000 is 128 PB
//0x0400000000000000 is 256 PB
//0x0600000000000000 is 384 PB
//0x07ffffffffffffff is 512 PB
//0x0800000000000000 is 0.5 EB
//0x0c00000000000000 is 0.75 EB
//0x0fffffffffffffff is 0.999 EB
//0x1000000000000000 is 1 EB
//0x1800000000000000 is 1.5 EB
//0x1fffffffffffffff is 1.999 EB
//0x2000000000000000 is 2 EB
//0x7fffffffffffffff is 7.999 EB

szx0427 2018-08-24
  • 打赏
  • 举报
回复

可以了,谢谢
szx0427 2018-08-24
  • 打赏
  • 举报
回复
引用 6 楼 srhouyu 的回复:
[quote=引用 5 楼 baidu_38494049 的回复:]
[quote=引用 4 楼 baidu_38494049 的回复:]
[quote=引用 1 楼 srhouyu 的回复:]
nFileSize / 1024 执行的是整数除法
dKB / 1024 执行的是浮点除法
改这样


double dKB = nFileSize / 1024.0; //获得文件大小(千字节)
double dMB = dKB / 1024; //获得文件大小(兆字节)
不行啊大神,还是这样啊


引用 1 楼 srhouyu 的回复:
nFileSize / 1024 执行的是整数除法
dKB / 1024 执行的是浮点除法
改这样


double dKB = nFileSize / 1024.0; //获得文件大小(千字节)
double dMB = dKB / 1024; //获得文件大小(兆字节)
不行啊大神,还是这样啊[/quote]
[/quote]

你不是在逗我吧。6374400除以1024本来就能整除,你不试试别的?[/quote]没考虑到这这一点
srhouyu 2018-08-24
  • 打赏
  • 举报
回复
引用 5 楼 baidu_38494049 的回复:
[quote=引用 4 楼 baidu_38494049 的回复:]
[quote=引用 1 楼 srhouyu 的回复:]
nFileSize / 1024 执行的是整数除法
dKB / 1024 执行的是浮点除法
改这样


double dKB = nFileSize / 1024.0; //获得文件大小(千字节)
double dMB = dKB / 1024; //获得文件大小(兆字节)
不行啊大神,还是这样啊


引用 1 楼 srhouyu 的回复:
nFileSize / 1024 执行的是整数除法
dKB / 1024 执行的是浮点除法
改这样


double dKB = nFileSize / 1024.0; //获得文件大小(千字节)
double dMB = dKB / 1024; //获得文件大小(兆字节)
不行啊大神,还是这样啊[/quote]
[/quote]

你不是在逗我吧。6374400除以1024本来就能整除,你不试试别的?
szx0427 2018-08-24
  • 打赏
  • 举报
回复
引用 4 楼 baidu_38494049 的回复:
[quote=引用 1 楼 srhouyu 的回复:]
nFileSize / 1024 执行的是整数除法
dKB / 1024 执行的是浮点除法
改这样


double dKB = nFileSize / 1024.0; //获得文件大小(千字节)
double dMB = dKB / 1024; //获得文件大小(兆字节)
不行啊大神,还是这样啊


引用 1 楼 srhouyu 的回复:
nFileSize / 1024 执行的是整数除法
dKB / 1024 执行的是浮点除法
改这样


double dKB = nFileSize / 1024.0; //获得文件大小(千字节)
double dMB = dKB / 1024; //获得文件大小(兆字节)
不行啊大神,还是这样啊[/quote]
szx0427 2018-08-24
  • 打赏
  • 举报
回复
引用 1 楼 srhouyu 的回复:
nFileSize / 1024 执行的是整数除法
dKB / 1024 执行的是浮点除法
改这样


double dKB = nFileSize / 1024.0; //获得文件大小(千字节)
double dMB = dKB / 1024; //获得文件大小(兆字节)
谢谢,刚才吃饭了,没回复
szx0427 2018-08-24
  • 打赏
  • 举报
回复
引用 1 楼 srhouyu 的回复:
nFileSize / 1024 执行的是整数除法
dKB / 1024 执行的是浮点除法
改这样


double dKB = nFileSize / 1024.0; //获得文件大小(千字节)
double dMB = dKB / 1024; //获得文件大小(兆字节)
不行啊大神,还是这样啊


引用 1 楼 srhouyu 的回复:
nFileSize / 1024 执行的是整数除法
dKB / 1024 执行的是浮点除法
改这样


double dKB = nFileSize / 1024.0; //获得文件大小(千字节)
double dMB = dKB / 1024; //获得文件大小(兆字节)
不行啊大神,还是这样啊
klc1 2018-08-24
  • 打赏
  • 举报
回复
nFileSize是int 1024也是int 所以还是整数运算,最后赋值给你的KB,所以小数部分当然都是0了
srhouyu 2018-08-24
  • 打赏
  • 举报
回复
nFileSize / 1024 执行的是整数除法
dKB / 1024 执行的是浮点除法
改这样


double dKB = nFileSize / 1024.0; //获得文件大小(千字节)
double dMB = dKB / 1024; //获得文件大小(兆字节)



64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧