gpt4 book ai didi

c++ - 继承自ifstream

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:25:31 25 4
gpt4 key购买 nike

我可以像这样从 ifstream 继承并从我的派生类读取文件吗:

#include <iostream>

using namespace std;

const string usage_str = "Usage: extract <file>";

class File: public ifstream
{
public:
explicit File(const char *fname, openmode mode = in);
void extract(ostream& o);
};

File::File(const char *fname, openmode mode)
{
ifstream(fname, mode);
}

void File::extract(ostream& o)
{
char ch;
char buf[512];
int i = 0;

while (good()) {
getline(buf, sizeof(buf));
o<<buf;
i++;
}
cout<<"Done "<<i<<" times"<<endl;
}

void msg_exit(ostream& o, const string& msg, int exit_code)
{
o<<msg<<endl;
exit(exit_code);
}

int do_extract(int argc, char *argv[])
{
cout<<"Opening "<<argv[1]<<endl;
File f(argv[1]);
if (! f)
msg_exit(cerr, usage_str, 1);
f.extract(cout);
return 0;
}

int main(int argc, char *argv[])
{
if (argc < 2)
msg_exit(cout, usage_str, 0);

do_extract(argc, argv);
return 0;
}

我希望它读取整个文件,但它只读取一个符号(不是给定文件的第一个符号)...

最佳答案

不要继承ifstream。如果您需要更改输入流的行为,请继承自 streambuf , 然后构造一个 istream周围。如果您只想添加助手,请将它们设为全局,以便您可以在任何 istream 上使用它们。

就是说,您的错误在 File 构造函数中:

File::File(const char *fname, openmode mode)
{
ifstream(fname, mode);
}

这会构造一个(未命名的)ifstream,然后立即将其关闭。您想调用父类(super class)构造函数:

File::File(const char *fname, openmode mode)
: ifstream(fname, mode);
{

}

关于c++ - 继承自ifstream,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4780503/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com