2015-12-03 4 views
5

Насколько мне известно, нет эквивалента libc для getline(), который работает с файловым дескриптором вместо работы с FILE *.getline() с файловым дескриптором вместо указателя файла

Есть ли (техническая) причина?

+1

'getline' не из стандарта C, я полагаю, вы имеете в виду функцию POSIX? –

+0

Дескриптор дескриптора файла настолько субъективен, что это может быть любая вещь из IOFile в сокет. поэтому строка чтения не может быть правильным методом для реализации, если только ее очень не связано с FILEs. –

ответ

7

Вы можете создать поток файлов из файла filedescriptor с помощью fdopen.

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

Файловые потоки запрашивают данные из ОС партиями, что повышает эффективность, однако файловый дескриптор может не работать это перезаписываемый файл - это может быть сокет или труба, и если вы задаете 100 символов, а третий символ этой партии 100 - это символ новой строки, тогда нет возможности полностью отменить чтение 97 символов после него.

+0

. Вам не нужно будет запрашивать одну ОС за один раз, простая реализация возможна с использованием статического буфера для извлечения столько байтов за раз как вы хотите от ОС. Это было упражнение по кодированию в школе, в которой я учился, в Epitech, называемом get_next_line. Я уверен, что вы можете найти множество студенческих проектов под этим именем на GitHub. Обратите внимание, что если вы хотите использовать один из них, вы должны получить тот, который хранит дескрипторы файла в массиве, чтобы иметь возможность обрабатывать несколько файлов за раз. – deb0ch

+1

@ deb0ch Конечно. Но тогда вы будете читать больше, чем только одну строку, что означает, что ваши последующие обращения к файлу будут отключены, если вы не будете продолжать использовать свой буферный уровень. B) перемотать назад. И b) не всегда возможно, потому что не все файлы перемотируются. – PSkocik

+0

Да, поэтому я говорил о статическом буфере, чтобы повторно использовать его в последующих вызовах и потреблять строки, уже присутствующие в буфере, прежде чем извлекать новые данные. Возможно, потребуется некоторая работа, чтобы сделать ее надежной между тегами close() и open(), дающими тот же fd для другого файла, но моя точка зрения заключается в том, что она * технически возможна. – deb0ch