Как остановить или прервать функцию низкоуровневого чтения, извлекающую оставшуюся часть буфера ввода с клавиатуры - PullRequest
0 голосов
/ 18 июня 2020

Что мне делать, чтобы программа не запускала oop самостоятельно через весь буфер клавиатуры? Я не очень хорошо знаю, как работает низкоуровневая функция read (), но очевидно, что это похоже на отдельный неблокирующий поток, который я не могу заставить остановить его, чтобы получить больше, чем я хочу.

Например, в приведенном ниже коде я просто хочу заставить пользователя ввести 4 символа с клавиатуры в терминале. Но из-за перевода строки '\ n', даже когда введено "123" + [ввод], ret = read (0, buffer, 4) возвращает 4, а не 3 ... таким образом, условие while l oop проверяется и программа входит в l oop, хотя этого не должно быть ... Кроме того, ret все равно получает значение 4 даже при вводе "1234" + [enter] ... но на этот раз встречается вторая проблема, while l oop выполняется дважды, таким образом, запрашивая две последовательные строки «Введите текст:» ...

Не могли бы вы помочь решить, как правильно организовать код, чтобы избежать дальнейшей обработки чтения буфера клавиатуры? а как побороть "123" + [ввод] = 4 символа неправильная оценка? Thnx

ПРИМЕЧАНИЕ: если вы наблюдаете выходное изображение, обратите внимание, что при вводе трех символов, таких как «123» и «456», они печатаются повторно, что указывает на то, что введено внутри while-l oop (хотя, не должно есть) .. и вторая проблема может наблюдаться при вводе "1234" и "7898" ... они все еще перепечатываются, показывая, что мы внутри l oop - это нормально ... но не должно быть двойных напечатаны подсказки «Введите текст:» ... они должны быть отдельными строками ... показывает, что функция чтения каким-то образом повторяется еще раз по l oop, для дополнительного символа перевода строки - [клавиша ввода] ... И когда введено несколько символов, l oop не должен запускаться для каждого ввода длиной 4 символа несколько раз.

Это код:

    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <string.h>

    #define BUFSIZE 1000

    unsigned char end=0;

    int main(int argc, char const *argv[])
    {

        char *buffer=(char*)malloc(sizeof(char)*BUFSIZE);
        char inp,*bptr=buffer;
        int ret;

        for(;;)
        {
            printf("Enter text : \n");
            /* READ automatically enters this loop even when bytes read are 
               more than 4, and it does it for each 4 next character in keyboard buffer
               */
            while((ret=read(0,buffer,4))==4)
            {
                if( !strcmp(bptr,"1111") || ret<0 )
                {
                    end=1;
                    break;
                }
                else {

                    for(int n=0;*(bptr+n) && *(bptr+n)!='\n' && n<=ret;n++) 
                        {
                            putchar(*(bptr+n));
                        }
                        putchar('\n');
                        buffer=bptr;
                    break;
                }


            }
            /* end of while loop */

            if(end) 
                {printf("End!");break;};
        }

        return 0;
    }

Программный вывод снимка экрана: Screen-shot program-output

Ответы [ 2 ]

0 голосов
/ 18 июня 2020
int main(int argc, char const *argv[])
{
    char buf[BUFSIZE];
    int ret;

    for(;;)
    {

        printf("Enter text : \n");

        while((ret=read(0,buf,4))==4)
        {

            buf[ret]='\0';

            if(!strcmp(buf,"exit"))
            exit(0);

            if(buf[ret-1]=='\n') break;
            else {
                printf("-- entered : %s \n",buf);
            }

        }/* end of while loop */
    }/* end of infinite loop */

            return 0;
        }
0 голосов
/ 18 июня 2020

Есть много способов сделать это, но если вы действительно хотите использовать чтение, вы можете скопировать содержимое буфера, заполненного чтением, во второй буфер примерно так:

char tempbuf[4];
int index = 0;


while((ret=read(0,buffer,4))==4)
        {
            index = index % 4;
            for( int i = 0; i < 4; i++ )
            {
                if(!isspace( buffer[i]) // or if(buffer[i] != '\n')
                tempbuf[++index] =buffer[i];
             }
            if( !strcmp(tempbuf,"1111") || ret<0 )
            {
                end=1;
                break;
            }
            else {

                for(int n=0;*(bptr+n) && *(bptr+n)!='\n' && n<=ret;n++) 
                    {
                        putchar(*(bptr+n));
                    }
                    putchar('\n');
                    buffer=bptr;
                break;
            }


        }
        /* end of while loop */

        if(end) 
            {printf("End!");break;};
    }
...