返回文件

时间:2016-06-12 14:55:54

标签: c++

我有一个用来返回文件大小的函数

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返回大小吗?

1 个答案:

答案 0 :(得分:4)

如果您查看std::ostringstream所拥有的this list of constructors,您会发现它没有复制构造函数。因此它不可复制。

当您按值返回对象时,例如ostringstream filesize函数,会从传递给return语句的表达式中复制初始化临时返回值。因此,您尝试做的是返回std::ostringstream对象的副本。但是,正如我们已经确定的那样,该类型不可复制。这就是您的编译器向您解释的原因,您尝试使用已删除的复制构造函数。

注意,自从C ++ 11以来,std::ostringstream确实有一个移动构造函数,所以如果你的编译器支持当前的标准,那么该程序将是合法的。

解决方案:在启用C ++ 11或更高版本标准的情况下编译,或者不返回std::ostringstream。也许返回std::string会更合适。