2015-02-02 3 views
1

Я пытаюсь обвести голову вокруг системного вызова read().Чтение файла byte by byte using read()

Как я могу прочитать фактический файл byte by byte используя read()?

Первый параметр - это дескриптор файла, который имеет тип int.
Как передать файл на звонок read()?

+1

Что вы пытаетесь? –

+0

'read (fd, & buffer, num_bytes)' –

+0

Вы можете использовать ['open()'] (http://pubs.opengroup.org/onlinepubs/009695399/functions/open.html), чтобы открыть файл и получить файловый дескриптор, который может использоваться позже как аргумент для 'read'. –

ответ

6

Открыть файл с open(); вы передаете дескриптор файла, возвращенный open(), до read().

int fd; 
if ((fd = open(filename, O_RDWR)) >= 0) 
{ 
    char c; 
    while (read(fd, &c, 1) == 1) 
     putchar(c); 
} 

Есть и другие функции, которые возвращают описатели файла: creat(), pipe(), socket(), accept() и т.д.

Обратите внимание, что в то время как это будет работать, это неэффективно, потому что он делает много системных вызовов. Обычно вы читаете большое количество байтов за раз, чтобы сократить количество системных вызовов. Стандартные библиотеки ввода-вывода (в <stdio.h>) обрабатывают это автоматически. Если вы используете низкоуровневые системные вызовы open(), read(), write(), close(), вам придется беспокоиться о буферизации и т. Д. Для себя.

1

Последний аргумент read() - это количество байтов для чтения из файла, поэтому, пройдя 1, он сделает это. До этого, вы используете open(), чтобы получить дескриптор файла, что-то вроде этого (непроверенных код):

int fh = open("filename", O_RDONLY); 
char buffer[1]; 
read(fh, buffer, 1); 

Однако, это, как правило, не рекомендуется читать файлы побайтно, так как это существенно влияет на производительность. Вместо этого, вы должны буфер ввод и обработать его на куски, например, так:

int fh = open("filename", O_RDONLY); 
char buffer[BUFFER_SIZE]; 
read(fh, buffer, BUFFER_SIZE); 

for (int i=0 ; i < BUFFER_SIZE ; ++i) { 
    // process bytes at buffer[i] 
} 

Вы, наконец, обернуть ваш читает в цикле, пока EOF не будет достигнута.

+1

Как этот код определяет, сколько данных было успешно прочитано? Конечно, нужно проверить возвращаемое значение 'read()'. – chux

+0

Вы правы. Я не представил полный пример, но после обертывания чтения в цикле было необходимо проверить возвращаемое значение read и обработать только столько байтов. –

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