Общая работа с файловыми потоками - PullRequest
0 голосов
/ 11 мая 2011

Я хочу работать с файловыми потоками в общем. То есть я хочу «программировать на интерфейс, а не на реализацию». Примерно так:

  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 ]

2 голосов
/ 11 мая 2011

Вы имеете в виду:

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 s и делает это с помощью универсального программирования.

1 голос
/ 11 мая 2011

Вы можете использовать различные специализации концепций 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...