C ++: какие преимущества дают потоки строк? - PullRequest
6 голосов
/ 25 февраля 2010

Может ли кто-нибудь рассказать мне о некоторых практических примерах использования строковых потоков в c ++, т.е. ввода и вывода в строковый поток с использованием операторов вставки и извлечения потока?

Ответы [ 4 ]

11 голосов
/ 25 февраля 2010

Строковые потоки можно использовать для преобразования всего, что реализует operator <<, в строку:

#include <sstream>

template<typename T>
std::string toString(const T& t)
{
  std::ostringstream stream;
  stream << t;

  return stream.str();
}

или даже

template <typename U, typename T>
U convert(const T& t)
{
  std::stringstream stream;
  stream << t;

  U u;
  stream >> u;

  return u;
}
3 голосов
/ 25 февраля 2010

Я использую их в основном в качестве буферов памяти, при создании сообщений:

if(someVector.size() > MAX_SIZE)
{
    ostringstream buffer;
    buffer << "Vector should not have " << someVector.size() << " eleements";
    throw std::runtime_error(buffer.str());
}

или для построения сложных строк:

std::string MyObject::GenerateDumpPath()
{
    using namespace std;

    std::ostringstream      dumpPath;

    // add the file name
    dumpPath << "\\myobject."
        << setw(3) << setfill('0') << uniqueFileId
        << "." << boost::lexical_cast<std::string>(state)
        << "_" << ymd.year 
        << "." << setw(2) << setfill('0') << ymd.month.as_number()
        << "." << ymd.day.as_number()
        << "_" << time.hours() 
        << "." << time.minutes() 
        << "." << time.seconds()
        << ".xml";

    return dumpPath.str();
}

Это полезно, потому что оно обеспечивает всю расширяемость std::stream s для использования символьных буферов (расширяемость ostream и поддержка локалей, управление буферной памятью скрыто и т. Д.).

Другим примером, который я видел, было сообщение об ошибке в библиотеке gsoap с использованием внедрения зависимости: soap_stream_fault принимает ostream & параметр для сообщения об ошибках в.

Если вы хотите, вы можете передать ему std :: cerr, std :: cout или реализацию std :: ostringstream (я использую это с реализацией std :: ostringstream).

2 голосов
/ 25 февраля 2010

Их можно использовать везде, где можно использовать обычный поток.

Так что в ситуациях, когда вы читали из файла, вы могли бы потенциально читать из потока строк.

void compile(std::istream& str)
{
    CPlusPlusLexer   lexer(str);
    CPlusPlusParser  parser(lexer);
    BackEnd          backend(parser);

    backend.compile();
}

int main()
{
    std::fstream   file("Plop.cpp");
    compile(file);

    std::stringstream  test("#include <iostream>\n int main() { std::cout << \"H World\n\";}");
    compile(test);
}
2 голосов
/ 25 февраля 2010

Помимо преимуществ, есть один пункт, чтобы тщательно рассмотреть , если вы используете gcc 4.3.1. Я не проверял предыдущие версии GCC.

...