2016-06-12 94 views
-1

的大小我有我使用返回文件的大小返回文件

float filesize(const char * filename){ 
    struct stat buf; 
    stat(filename, &buf); 
    return buf.st_size; 
} 

我試圖找出優雅的方式的功能,如何在MB返回尺寸/ GB/KB,而不是大數字? + extenstion e.g

1,25gb 
12,44kb 

我試圖返回的ostream e.g

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; 
} 

這returing OS拋出

error: use of deleted function 

爲什麼會發生此錯誤?另外,有沒有其他方式來以gb/mb/kb的形式返回大小?

+1

我建議你應該返回'std :: string',而不是'ostringstream'。 – MikeCAT

+1

二進制巨型不是1024000. – user2079303

+1

如果仔細查看錯誤消息,它應該解釋您嘗試使用哪個已刪除的函數。 – user2079303

回答

4

如果你看看std::ostringstreamthis list of constructors,你會發現它沒有拷貝構造函數。因此它不可複製。

當您按值返回對象(例如ostringstream filesize函數)時,臨時返回值將從傳遞給return語句的表達式複製初始化。所以,你試圖做的是返回一個副本std::ostringstream對象。但是,正如我們已經確定的那樣,這種類型是不可複製的。這就是爲什麼你的編譯器向你解釋,你試圖使用刪除拷貝構造函數。

請注意,既然C++ 11,std::ostringstream確實有移動構造函數,所以如果你的編譯器支持當前的標準,那麼這個程序就是合法的。

解決方案:編譯啓用C++ 11或更高版本標準,或者不返回std::ostringstream。也許返回std::string會更合適。