Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
0 / 0 / 0
Регистрация: 26.10.2018
Сообщений: 15

Непонятная работа потока ввода

02.12.2018, 14:02. Показов 1167. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем здравствуйте.
Возникла проблема в связи с использованием cin.putback, прошу знающих людей просветить по данному вопросу.
Допустим имеется два фрагмента кода:

C++
1
2
3
4
5
6
7
8
9
10
11
//....
//тут все нормально
std::string str;
        std::getline(std::cin, str, '\n');
        std::reverse(str.begin(), str.end());
        std::cin.putback('\n');
        for (auto i : str) {
            std::cin.putback(i);
        }
        std::reverse(str.begin(), str.end());
//......
C++
1
2
3
4
5
6
7
8
9
10
11
12
//.....
std::string str = i.equation;
            str += '\n';
                std::reverse(str.begin(), str.end());
                                std::cin.ignore();
                for (auto j : str) {
                    std::cin.putback(j);//здесь происходит ошибка записи
                }
 
                is_istream_full();
                std::reverse(str.begin(), str.end());
//.....
В первом фрагменте кода обратная вставка в поток происходит нормально , во втором - флаги cin через функции bad() i fail() дают true . Почему так происходит? Есть ли возможность вставки символов в поток минуя cin.putback? Возможно что-то еще?
Буду благодарен за любую помощь.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
02.12.2018, 14:02
Ответы с готовыми решениями:

Работа с cin при считывании с потока ввода
есть кусочек кода while (1) { string buf = name; cout << "Message : "; string symbolBuf = ""; while (cin >>...

Непонятная ошибка. Потоки ввода/вывода
Решал задачу и столкнулся с проблемой (первый день на c++ "пишу") не пойму что за ошибка #include "stdafx.h" #include...

Ошибка потока ввода
Здравствуйте. Подскажите, почему в этой простой программе, ошибка с оператором потокового ввода "<<"? Пишет,...

11
4 / 4 / 0
Регистрация: 10.11.2018
Сообщений: 25
02.12.2018, 15:26
std::string str = i.equation;
непонятная строка, смотри чему становиться равно str
0
0 / 0 / 0
Регистрация: 26.10.2018
Сообщений: 15
02.12.2018, 15:45  [ТС]
Цитата Сообщение от HamperC Посмотреть сообщение
непонятная строка, смотри чему становиться равно str
i.equation - объект класса уравнений , для получения уравнения , тут все нормально.

Добавлено через 1 минуту
Код урезанный , я взял лишь проблемный фрагмент , и один рабочий для сравнения.

Добавлено через 10 минут
Я слышал что подобным образом применять cin.putback , не есть хорошо , тогда какие альтернативы?
0
4 / 4 / 0
Регистрация: 10.11.2018
Сообщений: 25
02.12.2018, 15:46
тогда создай новую строку и добавь ее к str вместо 5-8 строки
string s_temp;
cin>> s_temp;
str+= s_temp;
0
0 / 0 / 0
Регистрация: 26.10.2018
Сообщений: 15
02.12.2018, 15:59  [ТС]
Цитата Сообщение от HamperC Посмотреть сообщение
тогда создай новую строку и добавь ее к str
вы вероятно не совсем поняли , мне не нужно добавлять что-либо в строку , мне надо ИЗ строки str запихнуть весь массив обратно в поток cin . Уравнение УЖЕ находится в str.

Добавлено через 3 минуты
Просто я хочу понять, есть ли способ без проблем закидывать обратно массивы обратно в поток ,
не создавая собственных типов данных и т.п. , или иного способа нет?
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
02.12.2018, 16:12
gvvg,
1) Думаю, стоит описать чего вы этим кодом хотите добиться?
2) В любой ситуации, когда вы пишете вопрос на форум, вы должны постараться предоставлять компилируемый пример, демонстрирующий вашу проблему. Чтобы те, кто отвечает, не занимались ручным восстановлением контекста, и не думали, что вы чего-то важного недопоказали (а такое очень часто бывает - новичок спрашивает о следствии проблемы, а причину спрятал и приходится из него ее клещами доставать).

Цитата Сообщение от gvvg Посмотреть сообщение
fail() дают true
Помещаемый назад символ должен совпадать с последним извлеченным. Похоже, что для вашего случая это не так.

Цитата Сообщение от gvvg Посмотреть сообщение
Есть ли возможность вставки символов в поток минуя cin.putback? Возможно что-то еще?
Для этого надо ответить на вопрос 1)

Добавлено через 1 минуту
Цитата Сообщение от gvvg Посмотреть сообщение
есть ли способ без проблем закидывать обратно массивы обратно в поток
Опишите задачу, зачем вам нужно закидывать массив в поток std::cin?
Без этого что-то дельное посоветует только телепат.
0
0 / 0 / 0
Регистрация: 26.10.2018
Сообщений: 15
02.12.2018, 16:20  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
1) Думаю, стоит описать чего вы этим кодом хотите добиться?
Пытаюсь построить парсер уравнений , мне ведь надо при каждом вызове данной функции заново ее анализировать.
Первое что пришло в голову - всякий раз загонять строку обратно в поток и считывать ее функцией парсера.
Парсер кстати - продолжение калькулятора от страустрапа , код могу дать , но его там много ,и завязано на остальные функции калькулятора , порядка 700 строк .
0
0 / 0 / 0
Регистрация: 26.10.2018
Сообщений: 15
02.12.2018, 16:27  [ТС]
code.zip
вот он
0
0 / 0 / 0
Регистрация: 26.10.2018
Сообщений: 15
02.12.2018, 16:28  [ТС]
буду благодарен за советы по улучшению кода
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
02.12.2018, 16:51
Лучший ответ Сообщение было отмечено gvvg как решение

Решение

Цитата Сообщение от gvvg Посмотреть сообщение
Первое что пришло в голову - всякий раз загонять строку обратно в поток и считывать ее функцией парсера.
Можете для этого использовать std::stringstream. У него есть конструктор от строки. Ваша функция просто должна работать не с std::cin напрямую, а с параметром std::istream &, в который вы передадите сперва std::cin, а потом объект строкового потока. Малой кровью получите то, что хотите.
1
0 / 0 / 0
Регистрация: 26.10.2018
Сообщений: 15
02.12.2018, 17:06  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
Можете для этого использовать std::stringstream
Попробую ,в любом случае благодарен за помощь.
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
02.12.2018, 18:11
Цитата Сообщение от gvvg Посмотреть сообщение
Пытаюсь построить парсер уравнений , мне ведь надо при каждом вызове данной функции заново ее анализировать.
Сохраняете уравнение в строку. Выкидываете текстовые потоки, вместо них берете итераторы. Или указатели как частный случай итераторов. Сбросить итератор в исходное состояние - задача тривиальная. Как пример с указателями - тыц.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
02.12.2018, 18:11
Помогаю со студенческими работами здесь

Создание потока ввода
Объясните, плиз, почему не получается инициализировать поток ввода внутри оператора switch ? код вот такой switch(mode){ case...

Обработка потока ввода
Подскажите, как сделать так, чтобы поток обрезал данные, которые находятся после нужного мне значения, например ввожу два числа: 1 5 -...

Перегрузка потока ввода
Помогите мне пожалуйста. Пыта #include <iostream> #include <conio.h> using namespace std; class rectangle { int *a; ...

Очистка потока ввода
Собственно тема подымалась в интернете, но внятного объяснения я не получил. Для ввода строки с пробелами использую cin.getline() Если...

Завершение потока ввода
Всем привет,столкнулся с небольшой проблемой,расскажите почему так происходит собственно.. сама суть проблемы.. После ввода нескольких...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru