Продолжайте повторять / повторять цикл пока не будет нажата кнопка ввода (или произвольная клавиша) - PullRequest
0 голосов
/ 19 января 2019

Я пытаюсь заставить цикл while повторяться, пока не будет нажата клавиша, в идеале enter.

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

Вот базовый код, с которым я работаю, который не работает, как я хотел бы, чтобы

while(1){       
    printf("Press Enter to Continue\n");    
    printf("Value to Update: %f\n",value_to_update); 
    usleep(10000);      
    system("clear"); 
    while(getchar() != '\n'){
        continue; 
    }       
}; 

Спасибо.С радостью уточнить все, что я сказал, или ответить на другие вопросы.

Я не уверен, как объяснить, что именно я ищу.Я попробую два способа:

1) Я хочу, чтобы он делал то, что делает следующий код, за исключением остановки, когда пользователь нажимает клавишу ввода:

while(1){           
    printf("Value to Update: %f\n",value_to_update); 
    usleep(10000);      
    system("clear"); 
};

2) Я перечислюшаги

1) Распечатать значение для обновления на экране

2) Дождаться N микросекунд

3) Нажала ли пользовательская пресса ввод?

3.False) Если No: очистить экран, перейти к шагу 1

3.True) Если Yes: выйти из цикла

Я думаю, это намного сложнеечем я думал, что это будет.

Ответы [ 2 ]

0 голосов
/ 19 января 2019

Вот пример кода, который работает с использованием вызова select.

Это только работает для новой строки, потому что слой TTY в ядре будет удерживаться до тех пор, пока он не получит новую строку.

Таким образом, для любого другого символа (например, пробела) нам нужно было бы выполнить вызовы ioctl, которые я упоминал в моих главных комментариях, чтобы перевести слой в «сырой» режим (по сравнению со значением по умолчанию «cooked») , Если вам это нужно, см. tcgetattr и tcsetattr вызовы.

#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <time.h>
#include <sys/time.h>
#include <sys/select.h>

int
main(void)
{
    int fd;
    char buf[10];
    int len;
    fd_set rdset;

    fd = 0;

    while (1) {
        // this is do whatever until newline is pressed ...
        printf(".");
        fflush(stdout);

        // set up the select mask -- the list of file descriptors we want to
        // wait on for read/input data available
        FD_ZERO(&rdset);
        FD_SET(fd,&rdset);

        // set timeout of 1ms
        struct timeval tv;
        tv.tv_sec = 0;
        tv.tv_usec = 1000;

        // wait for action on stdin [or loop if timeout]
        // the first arg must be: the highest fd number in the mask + 1
        len = select(fd + 1,&rdset,NULL,NULL,&tv);
        if (len <= 0)
            continue;

        // we're guaranteed at least one char of input here
        len = read(fd,buf,1);
        if (len <= 0)
            continue;

        // wait for newline -- stop program when we get it
        if (buf[0] == '\n')
            break;
    }

    printf("\n");

    return 0;
}
0 голосов
/ 19 января 2019
while(getchar() != '\n'){
        continue; 

Он не делает то, что вы думаете.

Вы хотите разорвать первый цикл.

If(getchar() == char_which_breaks_the_loop) break;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...