Какой смысл istringstream с openmode ios_base :: out - PullRequest
1 голос
/ 04 мая 2019

Какова цель аргумента конструктора istringstream openmode?

В частности, есть ли смысл указывать ios_base::out, так как я думаю, что этот объект никогда не поддерживаетоператор вставки потока << оператор?

1 Ответ

1 голос
/ 04 мая 2019

Потоки с режимом доступа ios_base::in не поддерживают никаких операций вывода.Методы, изменяющие последовательность, потерпят неудачу, если ios_base::out не указан.

С cppreference

Открытый режим: доступ, предоставленный внутренним объектом stringbuf к еговнутренняя последовательность символов.

ios_base::out - output - Последовательность поддерживает операции вывода .

ios_base::in всегда устанавливается для istringstream объектов (даже если явно не установлено в аргументе, который).Обратите внимание, что, хотя istringstream является входным потоком, его внутренний объект stringbuf может быть также настроен на поддержку операций вывода.Это влияет на некоторые операции, такие как putback, которые в istringstream могут изменять содержимое последовательности.

См. putback пример :

        std::istringstream s1("Hello, world", std::ios_base::out); //  stream supporting output operations
        s1.get();
        if (s1.putback('Y')) // modifies the buffer
            std::cout << s1.rdbuf() << '\n';
        else
            std::cout << "putback failed\n";

        std::istringstream s2("Hello, world"); // input-only stream
        s2.get();
        if (s2.putback('Y')) // cannot modify input-only buffer
            std::cout << s2.rdbuf() << '\n';
        else
            std::cout << "putback failed\n";

        s2.clear();
        if (s2.putback('H')) // non-modifying putback is OK
            std::cout << s2.rdbuf() << '\n';
        else
            std::cout << "putback failed\n";
...