Насколько мне известно, нет эквивалента libc для getline()
, который работает с файловым дескриптором вместо работы с FILE *
.getline() с файловым дескриптором вместо указателя файла
Есть ли (техническая) причина?
Насколько мне известно, нет эквивалента libc для getline()
, который работает с файловым дескриптором вместо работы с FILE *
.getline() с файловым дескриптором вместо указателя файла
Есть ли (техническая) причина?
Вы можете создать поток файлов из файла filedescriptor с помощью fdopen
.
Чтобы получить строку из файлового дескриптора, вам нужно спросить ОС для одного символа за раз, и это очень неэффективно. (read
, встроенный в оболочки POSIX, работает следующим образом: он считывает строки очень неэффективно, получая байты за раз.)
Файловые потоки запрашивают данные из ОС партиями, что повышает эффективность, однако файловый дескриптор может не работать это перезаписываемый файл - это может быть сокет или труба, и если вы задаете 100 символов, а третий символ этой партии 100 - это символ новой строки, тогда нет возможности полностью отменить чтение 97 символов после него.
. Вам не нужно будет запрашивать одну ОС за один раз, простая реализация возможна с использованием статического буфера для извлечения столько байтов за раз как вы хотите от ОС. Это было упражнение по кодированию в школе, в которой я учился, в Epitech, называемом get_next_line. Я уверен, что вы можете найти множество студенческих проектов под этим именем на GitHub. Обратите внимание, что если вы хотите использовать один из них, вы должны получить тот, который хранит дескрипторы файла в массиве, чтобы иметь возможность обрабатывать несколько файлов за раз. – deb0ch
@ deb0ch Конечно. Но тогда вы будете читать больше, чем только одну строку, что означает, что ваши последующие обращения к файлу будут отключены, если вы не будете продолжать использовать свой буферный уровень. B) перемотать назад. И b) не всегда возможно, потому что не все файлы перемотируются. – PSkocik
Да, поэтому я говорил о статическом буфере, чтобы повторно использовать его в последующих вызовах и потреблять строки, уже присутствующие в буфере, прежде чем извлекать новые данные. Возможно, потребуется некоторая работа, чтобы сделать ее надежной между тегами close() и open(), дающими тот же fd для другого файла, но моя точка зрения заключается в том, что она * технически возможна. – deb0ch
'getline' не из стандарта C, я полагаю, вы имеете в виду функцию POSIX? –
Дескриптор дескриптора файла настолько субъективен, что это может быть любая вещь из IOFile в сокет. поэтому строка чтения не может быть правильным методом для реализации, если только ее очень не связано с FILEs. –