2015-01-08 6 views
3

У меня есть программа на C, которая пытается читать до 1024 байт от stdin.Почему read() возвращает только первую строку stdin?

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

int main() { 
    int MAX_SIZE = 1024; 
    char *program = malloc(sizeof(char) * MAX_SIZE); 

    int STDIN_FD = 0; 

    int return_code = 0; 

    int bytes_read = read(STDIN_FD, program, MAX_SIZE); 
    if (bytes_read == -1) { 
     printf("Could not read from stdin"); 
     return_code = 1; 
    } else { 
     printf("bytes read: %d\n", bytes_read); 
     program[bytes_read] = '\0'; 
     printf("program: %s\n", program); 
    } 

    free(program); 

    return return_code; 
} 

Я скомпилировать и запустить его:

$ cat testfile.txt 
hello 
world 
$ gcc -Wall -std=c99 oneline.c 
$ cat testfile.txt | ./a.out 
bytes read: 6 
program: hello 

Почему read() только заполнить мой буфер с первой строкой ввода? Я не вижу ссылок на новые строки в man 3 read.

+0

Я предполагаю, что это тест, но на всякий случай всегда проверяйте возвращаемое значение 'malloc' –

+0

Ваш пример читает 12 байтов и печатает обе строки для меня. – pilcrow

ответ

4

От Линукс человек страниц read(2) руководство:

ВОЗВРАТ СТОИМОСТИ

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

Это потому, что вы читаете трубку. И очевидное решение - продолжать чтение до тех пор, пока не будет возвращено 0.

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