我有一个用来返回文件大小的函数
float filesize( const char * filename){
struct stat buf;
stat(filename, &buf);
return buf.st_size;
}
我试图找出优雅的方式,如何以mb / gb / kb而不是大数字返回大小? +扩展例如
1,25gb
12,44kb
我试过返回ostream例如
ostringstream filesize( const char * filename){
ostringstream os;
struct stat buf;
stat(filename, &buf);
if( buf.st_size > 1024000){
os << setprecision(2) << (float)buf.st_size/1024000 <<"mb";
}else if( buf.st_size > 1024){
os << setprecision(2) << (float)buf.st_size / 1024 <<"kb";
}
return os;
}
抛出
error: use of deleted function
在撤退中。
为什么会出现此错误?另外,还有其他方法可以用gb / mb / kb返回大小吗?
答案 0 :(得分:4)
如果您查看std::ostringstream
所拥有的this list of constructors,您会发现它没有复制构造函数。因此它不可复制。
当您按值返回对象时,例如ostringstream filesize
函数,会从传递给return语句的表达式中复制初始化临时返回值。因此,您尝试做的是返回std::ostringstream
对象的副本。但是,正如我们已经确定的那样,该类型不可复制。这就是您的编译器向您解释的原因,您尝试使用已删除的复制构造函数。
注意,自从C ++ 11以来,std::ostringstream
确实有一个移动构造函数,所以如果你的编译器支持当前的标准,那么该程序将是合法的。
解决方案:在启用C ++ 11或更高版本标准的情况下编译,或者不返回std::ostringstream
。也许返回std::string
会更合适。