【发布时间】:2018-01-15 22:09:55
【问题描述】:
我希望自己的类在任何情况下都能像 ifstream 一样工作,但我可以轻松获得文件的大小。
这是标题:
#include <fstream>
using namespace std;
class ifile: public ifstream {
size_t _file_size = 0;
size_t calculate_file_size();
public:
ifile(): ifstream(), _file_size(0) {}
ifile(const char *filename, ios_base::open_mode mode = ios_base::in):
ifstream(filename, mode)
{
_file_size = cal_file_size();
}
size_t get_file_size();
virtual ~ifile();
};
我发现了很多我不应该从 ifstream 继承的信息。那我怎样才能轻松解决我的问题呢?
编辑:
计算文件大小:
size_t ifile::calculate_file_size()
{
auto present_pos = tellg();
seekg(0, ifstream::end);
auto file_size = tellg();
seekg(present_pos);
return file_size;
}
- 很高兴看到合适的例子(如果我可以从
ifstream继承)。 - 原因是计算一次,读取多次。
- 为什么不
get_file_size(ifstream &ifs)?我的 ifstream obj 是静态的,所以它被计算了很多次。
【问题讨论】:
-
制作
get_file_size(ifstream& ifs)总是一种选择,对吧? -
作为奖励,当统一的函数调用使其成为语言时,它将无缝工作。
-
您可以编写一个包装类,其中包含一个
ifstream并授予对它的直接访问权限。然后,您可以在该包装器中提供您需要的功能。 -
我不知道“我不应该从 ifstream 继承的信息”说什么,但是子类化
std::ifstream并没有错。但与其他所有事情一样,这必须正确完成。