通常使用文件流

时间:2011-05-11 05:51:53

标签: c++ file-io generic-programming

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

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

2 个答案:

答案 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::istreamstd::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]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;
}