Чтобы понять, как входные потоки работы я разработал 2 из следующих классов:Пользовательский поток ввода. буфер потока и сгущенного метод
#include <iostream>
class my_streambuf: public std::streambuf
{
private:
std::streambuf* buffer;
char ch;
protected:
virtual std::streambuf::int_type underflow()
{
std::streambuf::int_type result = buffer->sbumpc();
if (result != traits_type::eof())
{
ch = traits_type::to_char_type(result);
setg(&ch, &ch, &ch + 1);
}
return result;
}
public:
my_streambuf(std::streambuf* buffer) : buffer(buffer) {};
virtual ~my_streambuf() {};
};
class my_istream: public std::istream
{
public:
my_istream(std::istream& stream) : std::istream(new my_streambuf(stream.rdbuf())) {};
virtual ~my_istream()
{
delete rdbuf();
}
};
int main()
{
char s[32];
my_istream is(std::cin);
is >> s;
std::cout << s;
return 0;
}
, которые работают нормально, пока я не изменить логику underflow
метода. Основная цель состоит в том, чтобы сохранить данные в c-string valiable s
, который отличается от пользовательского ввода. Для того, чтобы сделать простой тест, я изменил метод underflow
быть следующим:
virtual std::streambuf::int_type underflow()
{
std::streambuf::int_type result = buffer->sbumpc();
if (result != traits_type::eof())
{
result = traits_type::to_int_type('+'); // <-- this was added
ch = traits_type::to_char_type(result);
setg(&ch, &ch, &ch + 1);
}
return result;
}
С идеей заключается в том, чтобы вернуть метод только +
символов вместо пользовательского ввода символов. Так, например, если вход 123
, я ожидаю, что +++
будет храниться в переменной s
. И это не работает. Консоль висит, как будто она ждет больше ввода. Помогает только определенное нажатие клавиши (или отправка EOF).
Что мне здесь не хватает?
Как указывали @ferosekhanj, проблема была недостающий символ новой строки, который не был возвращен модифицированной версией underflow
к абоненту. Поэтому, чтобы код работал правильно, он должен быть возвращен. Эта версия метода работает нормально.
virtual std::streambuf::int_type underflow()
{
std::streambuf::int_type result = buffer->sbumpc();
if ((result != traits_type::eof()) && !traits_type::eq(traits_type::to_char_type(result), '\n'))
{
result = traits_type::to_int_type('+');
ch = traits_type::to_char_type(result);
setg(&ch, &ch, &ch + 1);
}
return result;
}
Если я не ошибаюсь, только 'cin' читает строку, пока не увидит линию. Другие потоки делают это до 'EOF'. – HighPredator
Что вы подразумеваете под другими потоками? cin - всего лишь экземпляр std: istream – ferosekhanj
Я имею в виду, что, насколько мне известно, это реализовано 'in' cin, а не класс потока. – HighPredator