2015-09-18 4 views
0

Пусть рассмотрим фрагмент кода:чтения (функция C), ведут себя странно

char *buffer = (char*) malloc(MAX_LENGTH_OF_COMMAND); 
while(1){ 
    printf("gsh> "); 

    read(0, buffer, sizeof(buffer)); 

} 

И поведение довольно странно. Я имею в виду, что выход для ввода «вход, вход, вход» входного сигнала «gsh> gsh> gsh> gsh>».

Так что я ожидал, что во время процесса ввода-вывода есть прерывание (я имею в виду получение данных от пользователя), потому что ожидание пользователя - это потеря времени. Хорошо, я это понимаю. Но что, если я должен использовать буфер в следующей строке, например:

char *buffer = (char*) malloc(MAX_LENGTH_OF_COMMAND); 
while(1){ 
    printf("gsh> "); 

    read(0, buffer, sizeof(buffer)); 
    // do something with buffer. 
} 

Поэтому необходимо иметь полный буфер (вход). Я этого не понимаю, и я не знаю, каким способом обеспечить доступность полного ввода.

Просьба пояснить. (и исправить мой ход мысли).

Заранее спасибо.

+0

Вы не распечатываете входные данные, поэтому почему ничего, кроме вашего приглашения, не печатается? –

+3

'sizeof (buffer)' не так, как вы думаете. 'buffer' - это указатель, поэтому это размер указателя (возможно, 4 байта), а не размер буфера, на который он указывает. – Barmar

ответ

4

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

Обратите внимание, что return() - это число прочитанных байтов, и ваш вход не будет завершен с нулевой точкой (потому что он не ожидает строки).

+1

В качестве альтернативы, вы можете продолжать чтение до тех пор, пока не будет прочитано определенное количество общих байтов. В любом случае, да, нужно зацикливаться, если вообще заботиться о деталях прочитанного и, конечно же, интересуется возвращаемым значением (что также может указывать на возникшую ошибку). –

Смежные вопросы