0

我想一般地使用文件流。也就是说,我想“编程到接口而不是实现”。像这样的东西:

  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 类层次结构,我如何实现我想要的?

4

2 回答 2

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::istreamand一起使用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::istreamstd::ostream接口进行了编程。但这不是通用编程。那就是面向对象的编程。

Boost.Iostreams 可以使类适应std::[i|o|io]streams,并使用泛型编程来做到这一点。

于 2011-05-11T06:15:14.380 回答
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;
}
于 2011-05-11T06:17:40.700 回答