Напишите конечную строку в STD :: CIN внешне, чтобы сделать его выходом из блокировки GetLine?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Напишите конечную строку в STD :: CIN внешне, чтобы сделать его выходом из блокировки GetLine?

Сообщение Anonymous »

В приведенном ниже примере я попытался реализовать оболочку командной строки, которая читает cin с использованием getline ; И я подумал, что лучший способ справиться с блокирующей природой GetLine - использовать его в потоке. Это действительно отлично подходит для меня - за исключением того, что я не могу остановить поток «внешне» из -за блокировки getLine . Условие, но это основной поток, который хочет, чтобы поток оболочки выключился). Однако, поскольку в то время getLine все еще блокируется, поток не может выйти, поэтому я просто получаю «остановку» - и мне нужно снова нажать Enter, чтобы сделать полный выход, который я нахожу массово раздражающим. Вы можете увидеть то, что я попробовал в приведенном ниже коде, но, к сожалению, это не работает, поскольку мне все еще нужно нажимать введите после «остановки», чтобы получить чистый выход. Ввод - это довольно взломан. /> < /blockquote>
попробовал это, не мог заставить класс для компиляции сначала, но даже позже, что я должен с этим делать? Иметь IDCIN IDCIN (std :: cin, myString) staction stamentiation, а затем используйте idcin , где бы я ни использовал std :: cin ? А что, что, я просто присваиваю myString и cin в конечном итоге выводит его? В любом случае, не удалось заставить это работать. и если вы делаете cin.rdbuf (file.rdbuf ()); at at start - но не если вы хотите изменить поведение во время выполнения (т.е. вы начали использовать cin нормально, а затем хотите, чтобы он выводил файл после некоторого времени; и все же, не хотите файл, нужна строка). /> Вместо того, чтобы облажаться с CIN, вы можете, чтобы ваша программа приняла общую std :: iStream & < /code>. При нормальном запуске просто передайте это cin . Во время модульного теста пропустите его по потоку ввода/вывода вашего собственного творения. Кроме того, возможно, это относится к отдельным экземплярам iStream (то есть cin для нормального запуска программы, что -то еще для тестового запуска) - здесь я бы хотел написать в cin в той же программе. PrettyPrint-Override ">

Код: Выделить всё

int main() {
using namespace std;
streambuf *backup;
istringstream oss("testdata");
backup = cin.rdbuf();
cin.rdbuf(oss.rdbuf());
string str;
cin >> str;
cout sputn("\r\n", 2);
std::cin.putback('\n');
if (tj.joinable())
{
tj.join();
}
}

void ShellThread::blocking_process_shell(void) {
while( active.load() ) {
printf("> ");
std::getline(std::cin, in_repl_cmd); // detects single press ENTER, and blocks
std::cin.clear();
printf("# %s\n", in_repl_cmd.c_str()); // echo response
}
}

int main(void) {
myshell.start();
std::this_thread::sleep_for(std::chrono::milliseconds(4000));
myshell.stop();
return EXIT_SUCCESS;
}

Итак, что я пытался сделать: std :: cin.clear () , поэтому любые предыдущие ошибки очищаются, а затем попытались записать непосредственно в rdbuf  cin  с std :: cin.rdbuf ()-> sputn ("\ r \ n", 2); std :: cin.putback ('\ n'); -ничего из этого не помогает с текущим поведением программы:
[code]$ ./test.exe
> hello
# hello
> there
# there
> STOPPING     # blocks indefinitely here, have to press ENTER or Ctrl-C *again* if I want it to exit
#

$
В конце концов, я даже не забочусь о том, чтобы писать все так много, все, что я хочу, - это заставить Getline выйти чисто - если бы был метод std :: cin.close () , я думаю, что это можно было бы так или иначе. или прокси, чтобы заставить GetLine выйти из блокировки ожидания?


Подробнее здесь: https://stackoverflow.com/questions/795 ... ng-getline
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»