Boost::iostreams::filtering_istreams ожидает E.O.F

Я должен использовать filtering_istream в качестве оболочки для std::cin. но это не работает, как я ожидал. Он ждет E.O.F, пожалуйста, помогите мне понять поведение.

#include <iostream>
#include <boost/iostreams/filtering_stream.hpp>
// compile using g++ -std=c++11 -lboost_iostreams

int main(){
    boost::iostreams::filtering_istream cinn(std::cin);
    std::cout << "Write something:";

    char c;
    while(true){
        cinn.get(c);
        std::cout << "Your character is : " << c << "\n";
        if(c=='.') break;
    }
}

Я хочу, чтобы он работал аналогично этому коду.

#include <iostream>
#include <boost/iostreams/filtering_stream.hpp>

int main(){
    //boost::iostreams::filtering_istream cinn(std::cin);
    std::cout << "Write something:";

    char c;
    while(true){
        std::cin.get(c);
        std::cout << "Your character is : " << c << "\n";
        if(c=='.') break;
    }
}

Вывод кода1

$./a.out
hello
how.are_you
Write something:Your character is : h
Your character is : e
Your character is : l
Your character is : l
Your character is : o
Your character is : 

Your character is : h
Your character is : o
Your character is : w
Your character is : .

вывод code2

$./a.out
Write something:hello
Your character is : h
Your character is : e
Your character is : l
Your character is : l
Your character is : o
Your character is : 

how.are_you
Your character is : h
Your character is : o
Your character is : w
Your character is : .

Код 2 дает результат, как я ожидаю. Он читает каждую строку и обрабатывает ее. в то время как Code1 читает все строки, пока не получит E.O.F. а затем он печатает вывод.

Оба кода ведут себя по-разному. Я не могу понять это поведение. Пожалуйста помоги. Заранее спасибо.


person srbcheema1    schedule 19.03.2018    source источник


Ответы (1)


Вы смотрите на буферизацию. Буферизация происходит на многих уровнях. В этом случае вы, вероятно, смотрите на буферизацию внутри фильтрующего потока.

Вы можете поиграть с такими вещами, как

  • set_device_buffer_size
  • set_filter_buffer_size
  • set_pback_buffer_size

На моей машине я получил результаты, которые вы хотели использовать (документы)

boost::iostreams::filtering_istream cinn(std::cin, 0, 1);
person sehe    schedule 19.03.2018