我想一般使用文件流。也就是说,我想“编程到接口而不是实现”。像这样:
ios * genericFileIO = new ifstream("src.txt");
getline(genericFileIO, someStringObject);//from the string library; dont want to use C strings
genericFileIO = new ofstream("dest.txt");
genericFileIO -> operator<<(someStringObject);
有可能吗?我对继承并不好。鉴于io类层次结构,我如何实现我想要的东西?
答案 0 :(得分:2)
你的意思是:
void
pass_a_line(std::istream& in, std::ostream& out)
{
// error handling left as an exercise
std::string line;
std::getline(in, line);
out << line;
}
这适用于std::istream
和std::ostream
的任何内容,如下所示:
// from a file to cout
// no need to new
std::ifstream in("src.txt");
pass_a_line(in, std::cout);
// from a stringstream to a file
std::istringstream stream("Hi");
std::ofstream out("dest.txt");
pass_a_line(stream, out);
这可以执行您的示例所做的操作,并针对std::istream
和std::ostream
接口进行编程。但这不是通用编程;这是面向对象的编程。
Boost.Iostreams可以将类调整为std::[i|o|io]stream
,并使用泛型编程来实现。
答案 1 :(得分:1)
您可以在ostream或istream接口上使用ostream或istream概念的不同特化。
void Write(std::ostream& os, const std::string& s)
{
os << "Write: " << s;
}
std::string Read(std::istream& is)
{
std::string s;
is >> s;
return s;
}
int main()
{
Write(std::cout, "Hello World");
std::ofstream ofs("file.txt");
if (ofs.good())
Write(ofs, "Hello World");
std::stringstream ss;
Write(ss, "StringStream");
Write(std::cout, ss.str());
std::string s = Read(std::cin);
Write(std::cout, s);
return 0;
}