С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
45 / 25 / 16
Регистрация: 14.04.2011
Сообщений: 623
1

Как выполнять std::cin в LOOP ?

19.02.2015, 19:03. Показов 2121. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Хочу сделать что то вроде командной строки.

1ый раз читает и выполняет нормально, но следующий раз вижу что ждет от меня ввода, но ни как не реагирует на него и 1 ядро CPU сразу поднимается на 100%

C++
1
2
3
4
5
6
7
int main ()
{
    Application* app = /*new Application();*/Application::getInstance();
    //delete app;
    while(app->CMD());    // проблемный loop
    return 0;
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
bool Application::CMD()
{
    std::string cmd;    std::cin >> cmd;
    if (cmd.empty())    return true;
 
    if (cmd == "q" || cmd == "quit" || cmd == "exit" || cmd == "stop")
    {
        std::cout << "Остановка..." << std::endl;
        tcp->Stop();
        return false;
    }
    else if (cmd == "tcp stop" || cmd == "tcpstop")
    {
        std::cout << "Отключаю TCP сокет.." << std::endl;
        tcp->Stop();
    }
    else if (cmd == "tcp start" || cmd == "tcpstart")
    {
        std::cout << "Включаю TCP сокет.." << std::endl;
        this->StartSockServer();
    }
    else
        std::cout << "Неизвестная команда: \"" << cmd << "\"." << std::endl;
    return true;
}
Первую строку любого содержания выполняет успешно, но сразу за ней получаю глюк, в терминале вижу что ожидает ввод, но уже во время этого ожидания приложение забирает 1 ядро от CPU, хотя в первое ожидание ввода все было хорошо.

В чем может быть ошибка?

Если инициализацию std::string cmd; убираю за пределы loop'a то следующий ввод он не ждет, а выводит несколько десятков раз предыдущую строку и после опять ждет ввод на 1 ядро от CPU
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Блог
19.02.2015, 19:03
Ответы с готовыми решениями:

Не воспринимает ни std::cout, ни std::cin. Вобщем ничего из std. Также не понимает iostream
Здравствуйте! Я хотел начать изучать язык C++. Набрал литературы. Установил Microsoft Visual C++...

Как std::cin считает CTRL + C?
Есть код. #include &lt;string&gt; #include &lt;iostream&gt; #include &lt;exception&gt; #include &lt;limits&gt; int...

Как исправить ошибку с std::cin
помогите у меня пропускает последующие вводы если вводишь знак или букву вот код ...

Не работает std::cout || std::cin
#include &quot;Account.h&quot; #include &lt;string&gt; #include &lt;iostream&gt; using std::cout; Account ::...

7
117 / 114 / 65
Регистрация: 18.09.2014
Сообщений: 337
19.02.2015, 19:26 2
Путин, попробуйте почистить поток ввода.

Не по теме:

Или запретите std::cin въезд на территорию России

0
45 / 25 / 16
Регистрация: 14.04.2011
Сообщений: 623
19.02.2015, 19:36  [ТС] 3
Гоблин-инженер, Пробовал вместо
C++
1
std::string cmd;    std::cin >> cmd;
писать
C++
1
2
std::cin.sync();    
getline(std::cin, cmd);
Но результат тот же.

Не по теме:

:D

0
117 / 114 / 65
Регистрация: 18.09.2014
Сообщений: 337
19.02.2015, 19:44 4
Путин, я может проблемы не понял, но у меня подобный код выполняется без проблем:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
#include <string>
 
using namespace std;
 
bool cmd() {
    string buff;
    cin >> buff;
    if (buff == "ogogo") cout << "OGOGO!" << endl;
    else if (buff == "ololo") cout << "OLOLO!" << endl;
    else return false;
    return true;
}
 
int main(int argc, char *argv[]) {
    while (cmd());
    return 0;
}
Миниатюры
Как выполнять std::cin в LOOP ?  
1
45 / 25 / 16
Регистрация: 14.04.2011
Сообщений: 623
19.02.2015, 20:03  [ТС] 5
Гоблин-инженер, ну да, скопировал и вставил - работает, скопировал в свой проект - 1 раз прочел верно, вернул true и сразу же откуда то прочитал еще что-то и вернул false...
C++
1
std::cin.sync();
не помог. Странно, ладно будем разбираться
0
117 / 114 / 65
Регистрация: 18.09.2014
Сообщений: 337
19.02.2015, 20:05 6
Путин, могу предположить, что это может быть как-то связано с пробелами в командах. "tcp start" будет воспринято программой, как 2 значения: "tcp" и "start"
1
45 / 25 / 16
Регистрация: 14.04.2011
Сообщений: 623
19.02.2015, 20:22  [ТС] 7
Гоблин-инженер, Не тут все работает, нашел проблему в StartSockServer().
Он создает новый объект TCP, который уже плодит себе потоки и работает с ними.
И если что-то не так, то я из TCP включая потоки пытаюсь сделать вывод в консоль:

C++
1
Application::getInstance()->printInfo("Info text");
C++
1
2
3
4
void Application::printInfo(std::string msg)
{
    std::cout << "\e[36m[" << currentDateTime() << "]  [Info]:  " << msg << "\e[39m " << std::endl;
}
Может дело в том, что выводить в момент ожидания ввода нельзя?
Вывод в консоль срабатывает, но скорее всего из-за этого он уходит в себя с ядром CPU, но при этом потоки продолжают работать и выводить сообщения.

Сейчас попробую убрать выводы в консоль из потоков, посмотрим что получится.
На скрине мои команды "foo" и "bar", видно что на 1ую он ответил, а на 2ую и следующие нет.
После ответа сразу 1 ядро CPU уходит.
Миниатюры
Как выполнять std::cin в LOOP ?  
0
45 / 25 / 16
Регистрация: 14.04.2011
Сообщений: 623
19.02.2015, 21:36  [ТС] 8
Ну да, как и предполагал... Убрал все выводы в консоль методом "Application::getInstance()->printInfo()"
и сразу все заработало. Это значит, что я не могу одновременно делать ввод и вывод в консоль юзая только 1 поток? Если я из потоков вывожу обычным std::cout то все работает.

Добавлено через 31 минуту
Нашел все таки тред который косячит, любой вывод в консоль из одного из тредов сразу нарушает всю работу...

Добавлено через 32 минуты
ну и как это обычно бывает, выяснилось что проблема была в логике приложения, исправил, работает

Добавлено через 32 секунды
Цитата Сообщение от Гоблин-инженер Посмотреть сообщение
Путин, могу предположить, что это может быть как-то связано с пробелами в командах. "tcp start" будет воспринято программой, как 2 значения: "tcp" и "start"
Действительно, так и оказалось.
0
19.02.2015, 21:36
cpp_developer
Эксперт
20123 / 5690 / 417
Регистрация: 09.04.2010
Сообщений: 12,546
Блог
19.02.2015, 21:36
Помогаю со студенческими работами здесь

Как проигнорировать последовательность символов в std::cin?
Есть два числа, разделенных последовательностью &quot;--:&quot;. Если бы это делалось при помощи sscanf: ...

Как заставить std::cin распознавать префиксы?
Здравствуйте, народ. Вы не знаете как заставить cin распознавать префиксы? типо: Ввод: 10...

Как работает cin.peek, cin,get, cin.ignore, cin.clear?
Здравствуйте, товарищи и не товарищи!:) Я только начал изучать C++, а уже использую вещи, которые...

Как ввести несколько переменных через пробел (std::cin)?
Как ввести несколько переменных через пробел?

std::cin, eof не всегда принимается как признак конца файла
std::string text; char ch = 0; while(!std::cin.get(ch).eof()){ text.append(1, ch); }...

Объясните пожалуйста как работают cin.good(), cin.sync(), cin.clear()
Такая проблема: сдаю в вуза лабораторные по программированию, писал все сам, до этого c++ не...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru